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中對線有什麼進階技巧?
越野跑上坡丨掌握這些技巧,上坡雙腿生風!
怎麼解決固體膠黏紙發皺的問題?
二十年廣告文案達人手把手教你零基礎寫出頂級文案

TAG:编程 | 技巧 | 逆向工程 |