Pwnable.kr - Writeup
題目:blackjack, collision, input, random
blackjack
Challenge Info
Hey! check out this C implementation of blackjack game!
I found it online
* http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html
I like to give my flags to millionares.
how much money you got?
Running at :
nc pwnable.kr 9009
Rule
遊戲規則就是二十一點,一開始設定賭金 bet,然後開始遊戲,如果贏了:cash += bet,否則 cash -= bet。
目標是賺到足夠多的錢。
Analysis
設定賭金的 function 如下:
| |
可以看到唯一的限制是 bet > cash,但沒有規定 bet 必須為正數,因此解法很明確了。
設定賭金為一個極小的負數如 -1000000000 ,然後輸一局遊戲就可以得到 flag。
Flag
YaY_I_AM_A_MILLIONARE_LOL
collision
Challenge Info
Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!
ssh col@pwnable.kr -p2222(pw:guest)
Solution
連線上去後看到 vol.c,內容如下:
| |
可以知道取得 flag 的條件為:
argv[1]的大小為20byte- 根據
check_password,argv[1]每4byte作為一個int之總和需為0x21DD09EC
也就是建造五個int且總和為0x21DD09EC即可。
我將前四個int設為0x01020304,因此最後一個int為0x21DD09EC - 0x01020304 * 4
使用pwntools幫忙建構,指令如下:
| |
執行後得到flag
Flag
daddy! I just managed to create a hash collision :)
input
Challenge Info
Mom? how can I pass my input to a computer program?
ssh input2@pwnable.kr -p2222(pw:guest)
Solution
input.c 內容如下:
| |
目標很明確,根據輸入的類型分成五關,都通過之後得到 flag。
Stage 1
第一關要處理參數的輸入
argc : 參數數量
argv[0] : 第0個參數
也就是要求傳入 100 個參數,並且第 56、57 個參數分別為 \x00、\x20\x0a\x0d。
要注意的是 function 本身也是一個參數,如 ./input A B C 就有四個參數
Stage 2
第二關要用 stdin 跟 stderr 輸入
Stage 3
第三關要處理 env
使用 pwntools 的話將指定內容存成 dictionary 作為 process 的 env 參數即可。
Stage 4
第四關是檔案讀取
題目要讀入檔名為 \x0a 的檔案,且裡面的內容為 \x00\x00\x00\x00。
用 python 的話輕鬆解
Stage 5
第五關要用 socket 輸入
簡單來說它會啟用一個 socket server 監聽 port argv['C'],收到 \xde\xad\xbe\xef 的話就過關。
使用 pwntools 的話,用 remote , host : 127.0.0.1, port : argv['C'] 再傳 deadbeef 過去即可。
使用 python 的完整原始碼如下:
| |
Flag
Mommy! I learned how to pass various input in Linux :)
random
Challenge Info
Daddy, teach me how to use random value in programming!
ssh random@pwnable.kr -p2222(pw:guest)
Solution
random.c 內容如下:
| |
rand() 不是真隨機,每次執行的 seed 都是 1,所以 random 為定值。
只要知道 random 的值,就能夠算出 key (= 0xdeadbeef ^ random) 進而得到 flag。
簡單寫個程式輸出 rand() 即可,例如:
| |
得到 random = 1804289383,因此 key = 0xdeadbeef ^ 1804289383 = 3039230856
執行 random 之後得到 flag。
趁機練習用 gdb 找 random。
| |
把中斷點設在 0x0000000000400621 <+58>: cmp eax,0xdeadbeef,此時 random 會在 rbp-4
| |
得到 random = 0x6b8b4567
Flag
Mommy, I thought libc random is unpredictable...