1. 程式人生 > >pwnable.kr [Toddler's Bottle]

pwnable.kr [Toddler's Bottle]

寫在最前:

想要成為安全大牛的願望還是這麼遙不可及。
漸漸地,沒有什麼憂慮的大學生活也好像開始有了一些屬於小人物的忐忑。
還是堅信自己很厲害,可是道路前方仍是一篇迷濛。

感謝幫助過我的前輩,以及讓我可以暫時不考慮經濟壓力的父母。

I have a binary that has a lot information inside heap.
How fast can you reverse-engineer this?
(hint: see the information inside EAX,EBX when 0x403E65 is executed)

ssh

[email protected] -p2222 (pw:guest)

題目大意是逆向分析這個 PE 檔案,並在服務主機上提交 2 個有關這個檔案的問題的答案。

  1. What is the string inside 2nd biggest chunk? :
  2. What is the string inside 3rd biggest chunk? :

全部答對即可得到 Flag。

在做逆向分析之前,先跑一下程式猜測一下流程。

執行程式後,會給出提示,大意為程式會分配1000個大小隨機堆塊,每個堆塊中儲存有一個隨機的字串。其中最大的堆塊大小為 99879 byte,其中包含的字串為 X12nM7yCJcu0x5u。

多次執行程式,提示的最大堆塊大小和其中的字串不變。按照獲取Flag的要求,猜測這裡的隨機的意思應該是指定大小的堆快在空間分配上的隨機,固定大小序列的堆塊中儲存的字串應是固定的或者遵循某種固定的構造演算法。

下面開始分析(無殼無加密無VM)
在提示中讓我們去檢視 0x403E65 處指令執行後 EAX , EBX 的情況,
根據物理機實際的不同,筆者的提示指令位於0x0E3E65處。
這裡寫圖片描述

可以看到,此處EAX儲存著當前次迴圈分配的堆塊大小,EBX儲存著堆塊的地址。
繼續執行,將棧中儲存的迴圈次數傳到EAX,自增1後傳回棧中儲存,同時驗證這個值。
這裡寫圖片描述

問題所需的是第二和第三大堆塊中儲存的字串內容,由於分配了1000次,不可能由觀察得到。這裡藉助IDA動態除錯結合指令碼IDC去比較每次堆分配執行後EAX的值來指向目標堆塊。
指令碼如下:

#include <idc.idc>  

static main(){  

    auto max_eax, max_ebx, second_eax, second_ebx, third_eax, third_ebx;  
    auto eax, ebx;  

    // 依次為前三大堆塊分配完成時的eax和ebx值
    max_eax = 0;  
    second_eax = 0;  
    third_eax = 0;  
    max_ebx = 0;  
    second_ebx = 0;  
    third_ebx = 0;  

    AddBpt(0x083E65);      // 在提示位置新增斷點,在IDA中該地址為0x83E65
    StartDebugger("","","");  
    auto count;  
    for(count = 0; count < 999; count ++){  
        auto code = GetDebuggerEvent(WFNE_SUSP|WFNE_CONT, -1);  
        eax = GetRegValue("EAX");     // 中斷時得到所需的值
        ebx = GetRegValue("EBX");  

        // 判斷是否應重新整理前三大堆塊的值
        if(max_eax < eax){  
            third_eax = second_eax;  
            third_ebx = second_ebx;  
            second_eax = max_eax;  
            second_ebx = max_ebx;  
            max_eax = eax;  
            max_ebx = ebx;  
        }else if(second_eax < eax){  
            third_eax = second_eax;  
            third_ebx = second_ebx;  
            second_eax = eax;  
            second_ebx = ebx;  
        }else if(third_eax < eax){  
            third_eax = eax;  
            third_ebx = ebx;  
        }  
    }  
    // 輸出
    Message("max eax: %d, ebx: %x, second eax: %d, ebx: %x, third eax: %d, ebx: %x\n", max_eax, max_ebx, second_eax, second_ebx, third_eax, third_ebx);  
}  

迴圈999而不是1000次是為了避免程式結束,堆空間被釋放。
在IDA Script Commend中輸入指令碼並儲存為.idc格式,在Debugger選項中配置好動態偵錯程式。跑Script File即可。
這裡寫圖片描述

最後根據跑出的結果到對應的堆塊位置找到字串。

[email protected]:~$ nc 0 9021
What is the string inside 2nd biggest chunk? :
roKBkoIZGMUKrMb
Wait for 10 seconds to prevent brute-forcing…
What is the string inside 3rd biggest chunk? :
2ckbnDUabcsMA2s
Wait for 10 seconds to prevent brute-forcing…
Congratz! flag : select_eax_from_trace_order_by_eax_desc_limit_20

相關推薦

pwnable.kr [Toddler's Bottle]

寫在最前: 想要成為安全大牛的願望還是這麼遙不可及。 漸漸地,沒有什麼憂慮的大學生活也好像開始有了一些屬於小人物的忐忑。 還是堅信自己很厲害,可是道路前方仍是一篇迷濛。 感謝幫助過我的前輩,以及讓我可以暫時不考慮經濟壓力的父母。 I have

pwnable.kr解題write up —— Toddler's Bottle(一)

1. fd #include <stdlib.h> #include <string.h> char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc<2){

pwnable.kr】 flag

github down 代碼 ring lag 程序 load 沒有 mob pwnable從入門到放棄 第四題 Download : http://pwnable.kr/bin/flag 下載下來的二進制文件,對著它一臉懵逼,題目中說是逆向題,這我哪會啊。。。 用i

pwnable.kr】leg

輸入 read %d ssh http com fcn dump only pwnable從入門到放棄第八題。 Download : http://pwnable.kr/bin/leg.cDownload : http://pwnable.kr/bin/leg.asm s

pwnable.kr】cmd1

strstr blog pre += 其中 函數 /tmp har cmd 最近的pwnable都是linux操作系統層面的。 ssh [email protected]/* */ -p2222 (pw:guest) 首先還是下載源代碼: #includ

pwnable.kr】cmd2

函數 environ 自動 memset 上一個 ima lin ret 保持 這道題是上一個cmd1的升級版 ssh [email protected]/* */ -p2222 (pw:mommy now I get what PATH environmen

pwnable.kr】 codemap

hunk see seed heap while malloc cati 根據 ont pwnable新的一題。 download: http://pwnable.kr/bin/codemap.exe ssh [email protected]/* */ -p

pwnable.kr bof之write up

car stdio.h ble str 不同 -1 [] 得到 imp 這一題與前兩題不同,用到了靜態調試工具ida 首先題中給出了源碼: 1 #include <stdio.h> 2 #include <string.h> 3 #

pwnable.kr lotto之write up

write char tail 技術 match ima style string sign 源代碼 : #include <stdio.h> #include <stdlib.h> #include <string.h> #

pwnable.kr cmd1之write up

變量 雙引號 inux ron argv enter nbsp cnblogs linux通配符 看一下源代碼: 1 #include <stdio.h> 2 #include <string.h> 3 4 int filter(char

pwnable.kr-echo1-Writeup

blog inux cnblogs span style symbol bin sym utf-8 pwnable的echo1,一個棧溢出的漏洞,同樣以後再補上分析過程和思路,先放exp 1 #!/usr/bin/env python 2 # -*- coding:

Pwnable.kr WP

近期,開始將以前做的CTF的題目,全部整理一遍,寫個WP,也是為了督促自己,還需要學的東西還有很多。 Pwnable.kr fd  我們首先看到這道題的C原始碼: 需要得到flag,則需要執行 system("/bin/cat flag"); 則 必須 buf =

18.9.17 pwnable.kr----collision

同樣的操作,找到c的原始碼 用(int*)強制轉換,然後賦給給ip,ip的錢五個值的和等於res 剛開始我們要輸入20個位元組(強制轉換成int型後,正好分成了五組) 執行check_password之後返回的值要等與0x21DD09EC 上指令碼(參考了大佬的)

pwnable kr 之 random

(gdb) disass main Dump of assembler code for function main: 0x00000000004005f4 <+0>: push %rbp 0x00000000004005f5 <+1>

pwnable.kr-leg-mistake-shellshock

leg #include <stdio.h> #include <fcntl.h> int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc,

pwnable.kr】 leg

  本關主要涉及了一些arm彙編的知識。 閱讀leg.c原始碼發現,本關呼叫scanf從標準輸入讀取key後,判斷是否和key1 key2 key3 三個函式的返回值的和相等。如果相等,則輸出flag。但是ARM彙編的函式返回值和暫存器R0有關,並且key函式中涉及到了

pwnable.kr】 mistake

這關很有意思,題目本意是一道原始碼中運算子優先順序導致的問題,如果直接看binary的話,看反編譯程式碼就不會被運算子優先順序迷惑。 先看一下反編譯程式碼,main函式。程式判斷/home/mis

pwnable.kr】 blackjack

看了一下游戲規則,玩家和AI一起玩牌,起初有500塊,首先下注,之後每次各自會收到一張隨機的牌(點數1-13),最先達到21點的人贏。每次拿到牌之後,你可以選擇hit(繼續拿牌)或者是stay(不拿)。如果繼續拿了牌之後超過21點,那麼你就輸了。如果你選擇stay

pwnable.kr】lotto

lotto - 2 pt [writeup] Mommy! I made a lotto program for my homework. do you want to play? ssh [email protected] -p2222 (pw:guest

pwnable.kr input解題記錄

pwnable input解題記錄 給了原始碼如下: #include "stdio.h" #include "unistd.h" #include "stdlib.h" #include "arpa/inet.h" int main(){ //stage argv char *arg