CTF逆向題中的編程技巧
作者:陳雲
最近一直在學習逆向相關的東西,發現了一道好玩的題目。題目難度不高,但用到了各種編程姿勢。很秀!
先看看題目到底是什麼樣的吧,這是一道2017年的bsidessf-ctf中的一道題目。
一眼就瞭然了,程序會比較計算機名,操作系統版本,cpu型號來給出最後的flag
這篇文章不關注如何得到flag,關注的是出題人如何獲得計算機名等信息,並怎樣花式退出程序的。
使用管道進行與子進程的通信
先看獲得計算機名的過程吧:
父進程創建了一個管道pipe,然後又fork了一個子進程,讓子進程來使用uname -n來讀取計算機名。
然後父進程等待子進程結束,再從被重定位的管道里讀取計算機名
結束進程姿勢1
接下來看看如果名字對不上是怎麼結束進程的呢:
raise(9)n
這個就是kill -9 +pid的意思了
讀取文件並截獲版本號
現在我們看程序是怎麼獲得操作系統信息的:
程序會讀取/proc/version文件的內容,然後截取第二個空格,最後再截取到不是字母或者數字或者「.」的那一位。
如圖,用紅線標出的第二個空格,和後面第一個「-」號(不是字母、數字、也不是「.」)。
他們之間的字元就是程序最後讀取的字元。
結束進程姿勢2
s1 /= v5 /v5 -1n
一個除0異常!這也會導致進程退出!
獲得CPU型號
這段程序使用了一個彙編指令cpuid,我們去調試看看它到底返回了什麼
返回了這麼一串東西到我們的字元串里,把他們轉換成字元串:
原來是AuthenticAMD
這個字元串
結束進程姿勢3
.text:0000000000402832 mov eax, 1 n.text:0000000000402837 xor ebx, ebx ; status n.text:0000000000402839 int 80h ; LINUX - sys_exitn
int 80是linux的系統調用,至於調用什麼系統調用則由eax寄存器的值決定
這裡eax的值是1,查看unistd.h
的內容:
#define __NR_exit 1n
所以這裡三條指令就是進程退出的意思了。至於int 80 具體進行系統調用的動作,又可以說一大堆了....
這裡就不說了,感興趣的可以去查閱linux內核的相關資料~~~~
推薦閱讀:
※DOTA2中對線有什麼進階技巧?
※越野跑上坡丨掌握這些技巧,上坡雙腿生風!
※怎麼解決固體膠黏紙發皺的問題?
※二十年廣告文案達人手把手教你零基礎寫出頂級文案