1. 程式人生 > >Pwnable.kr WP

Pwnable.kr WP

近期,開始將以前做的CTF的題目,全部整理一遍,寫個WP,也是為了督促自己,還需要學的東西還有很多。

Pwnable.kr fd 

我們首先看到這道題的C原始碼:

需要得到flag,則需要執行

system("/bin/cat flag");

則 必須 buf = "LETMEWIN"。

read(fd, buf, 32)函式中的三個引數中:

fd == 0時:則表示標準輸入;

fd == 1時:則表示 標準輸出;

fd == 2時,則表示標準輸出錯誤。

buf 表示讀入的緩衝區;

32表示讀入32位元組;

所以我們 只需要 使 fd == 0 ,則我們就能自己輸入 LETMEWIN 到 buf中。這樣最終得到flag。

那麼我們就要令

argv[1] = 0x1234

即 argv[1] = 4660


Pwnable.kr Collision

這道題主要是 我們輸入的 20個 字串 轉換為 int 型之後,相加之後 要等於  0x21DD09EC。

我們先來了解一下 char 型 強制轉換為 int 型 的方法:

如果我們輸入的字串是: 12345678, 則轉換為 ASCLL碼之後。每4位轉為一個 int 型。 之所以 順序改變是 因為 小端序的原因。

所以 我們 輸入的 20個 字串, 最終會 轉換為 5個 int 型 陣列, 剛好夠加5次。

我們只需要 輸入 5組 數,使其相加 為 0x21DD09EC 即可。

那麼 我們 前4組數 使其 都為 0x02020202, 最後一組數 為 0xE401D519(此處因為小端序的原因會改變儲存的順序).


Pwnable.kr mistake

根據題目和提示,我們可以發現這道題的漏洞在與 運算子的優先性問題。我們可以看到如下程式碼:

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)

這段程式碼中,由於  比較運算子 優先順序中 <  的優先順序 高於  =  的優先順序。也就是上述程式碼的執行順序變為如下:

if( fd= (open("/home/mistake/password",O_RDONLY,0400) < 0 ))

而我們知道 open() 函式 開啟一個檔案成功之後,就會返回一個非零數值,那麼 永遠比 0大,所以比較之後,將會返回 false 也就是 0。 所以 最終 fd = 0;  而當 fd = 0 之後,我們以下的程式碼:

len=read(fd,pw_buf,PW_LEN)

此程式碼將會變為 stdin, 也即是讀取使用者輸入,我們可以輸入任意的數值。 所以我們可以如下輸入:

pw_buf = 1111111111

pw_buf2 = 0000000000;

因為 pw_buf2 ^ 1111111111 = 1111111111;


Pwnable.kr shellshock

這道題,可以先對 shellshock有一定的瞭解:

https://blog.csdn.net/pygain/article/details/53969081

然後按照漏洞去執行 bash -c cat flag的命令即可

 


Pwnable.kr uaf

此題需要用到虛擬函式和堆的知識,博主對堆不太瞭解,只對虛擬函式有一定的瞭解,看了別人的WP,也只是瞭解一點,等以後有更深的知識了,再來補吧,下面放兩篇我覺得寫的挺詳細的WP,供參考:

https://bbs.pediy.com/thread-224651.htm

https://blog.csdn.net/qq_20307987/article/details/51511230


Pwnable.kr cmd2

 

 

我們可以看到 這道題對我們輸入的 grgv[1] 的進行了過濾,過濾掉了 / 、 ‘ 、 flag 等,那麼我們要輸入的引數原本為:

/bin/cat flag 就要進行繞過。

那麼 flag 可以用適配符代替, 但是  /  怎麼辦呢?

pwd  命令是輸出當前目錄名的, 如果我們當前目錄在根目錄下,那麼我輸出的不就是 /  嗎?

所以我們可以先進入到根目錄,隨後如下操作:

./home/cmd2/cmd2  '""$(pwd)bin$(pwd)cat $(pwd)home$(pwd)cmd2$(pwd)fl*""'