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...