[攻防世界]新手区cgpwn2
依旧,先看文件属性信息,得知是个32位程序,且只开了NX
拖进32位IDA,先看字符串窗口,找有无可利用的字符串。

只找到了system,没有cat flag或者/bin/sh等字符串,再结合题目描述的提示“菜鸡认为自己需要一个字符串”,猜测需要自己输入一个/bin/sh,然后把它当参数传system函数里,拿到shell。
然后看伪代码,找漏洞,main里没什么可疑的,但是调用了一个hello函数,点进去看看
发现了一个会导致溢出的gets
运行程序发现是让我们输入两次,第一次输入名字,第二次gets了你留下的讯息。
思路:
- 由于只开启了NX,那么name的地址是不变的,记下name地址,输入’/bin/sh’到name里

- 利用gets溢出,覆盖返回地址为system的函数地址
- 把name作为参数传给system,构成system(“/bin/sh”)
- ls看文件,cat flag拿到flag
EXP:
1 | from pwn import * |
payload解释:
- ‘a’*42:看栈可知s距离ebp有0x26,十进制即为38,再加上需要覆盖的ebp长度,由于是32位程序,所以ebp长度0x4,所以总共需要填充’a’*(38+4)


- p32(sys_addr):system函数的地址
- p32(0xaaaa):用于填充system函数的返回地址,由于system(“/bin/sh”)后直接拿到shell,所以随便填个返回地址就行
- p32(binsh_addr):name的地址,因为name的值就是’/bin/sh’,所以用它作为system的参数
可以不用/bin/sh,在name输入的时候用cat flag也可以直接拿到flag