hipwn - zer0pts CTF 2020

hipwn - zer0ptsCTF2020(My solver) hipwn - zer0ptsCTF2020(Official GitLab) 方針 .bss section に/bin/shという文字列を置いて、 Return Oriented Programming(ROP)を組んで、 execve("/bin/sh", 0, 0)を実行する。 ROP gadgetとは gadgetとは、pop rdi; ret;などのret;で終わるコード片のことです。 今回、必要なgadgetはrdi rsi rdx rax syscall です。 gadget 役割 rdi 第1引数 rsi 第2引数 rdx 第3引数 rcx 第4引数 r8 第5引数 : : rax システムコール番号 syscall システムコール また、execveのシステムコール番号は59である。 .bss section とは rw(read and write)が可能な初期値を持たない変数を格納するためのセクションである。 .bss sectionを使う理由は、rwできて便利だから。 通常の入力に"/bin/sh"を送って、バッファのアドレスを指定してもいいと思う。 gadgetを探す旅🐈 ropperを使って、それぞれのgadgetを探します。 例) $ ropper -f chall --search "pop rdi;" 0x000000000040141c: pop rdi; ret; rop_pop_rdi = 0x0040141c rop_pop_rax = 0x00400121 rop_pop_rsi_r15 = 0x0040141a rop_pop_rdx = 0x004023f5 rop_syscall = 0x004024dd IUPAP命名法 余談ですが、ROP gadgetを書くときは、 わかりやすいようにIUPAP命名法にしたがいます。...

2022-05-03 · 2 分 · Me

uaf4b - CakeCTF2021

uaf4b - CakeCTF2021(My solver) uaf4b - CakeCTF2021(Official GitHub) 方針 Use after Free によって関数ポインタをsystem関数で書き換える。 CAWSAY 構造体について 重要なのは、main.cの47〜50行目の構造体である。 freed chunkでは、fn_dialogueがfd、messageがbkに割り当てられる。 typedef struct { void (*fn_dialogue)(char*); char *message; } COWSAY; また、main.cの167〜171行目で、 cowsay->fn_dialogue(cowsay->message);が実行されることに留意しておく。 case 1: /* Use cowsay */ printf("[+] You're trying to call 0x%016lx\n", (addr)cowsay->fn_dialogue); cowsay->fn_dialogue(cowsay->message); break; malloced chunk 実際にmallocされたときのHeap領域は次の図のようになっている。 freed chunk 次に、freeすると、次の図のようになる。 system("/bin/sh")を呼び出す この2つの図を見るとわかるように、関数ポインタfn_dialogueの位置にfdが割り当てられている。 つまり、fn_dialogueをsystemに、COWSAY->message = /bin/shにすれば、 system("/bin/sh")が呼び出される。 Solver from pwn import * context(os = 'linux', arch = 'amd64') context.log_level = 'debug' io = process("....

2022-05-02 · 1 分 · Me

Beginner's Heap - SECCON beginners CTF 2020

Beginner’s Heap (My solver) 作問者writeup 方針 Heap overflowによって、下のチャンクのfdとサイズを書き換えて、tcache poisoning によるwin関数の呼び出し。 やる Bの領域をmallocしてfreeすることで、tcache(の0x20ようのスレッド)につなげる。 -=-=-=-=-= TCACHE -=-=-=-=-= [ tcache (for 0x20) ] || \/ [ 0x000055dfd3002350(rw-) ] || \/ [ END OF TCACHE ] -=-=-=-=-=-=-=-=-=-=-=-=-=-= 1. Bのfdを書き換える freeされたチャンク(freed chunk)のfdがNULLなので、次につながっているfreed chunkはない。 ここで、AのHeap Overflowを利用して、Bのfdを書き換えるとfdに値が入るので、tcache君はBの次があると錯覚する。 A*24 + 0x31 + __freehookを与えた図。 2. fdを__free_hookで書き換える fdを__free_hook(のアドレス)で書き換えると、tcacheはこのようになる。 (tcacheを汚染しているので、これをtcache poisoningという) -=-=-=-=-= TCACHE -=-=-=-=-= [ tcache (for 0x20) ] || \/ [ 0x0000557af97c3350(rw-) ] || \/ [ 0x00007effac9cc8e8(rw-) ] || \/ [ END OF TCACHE ] -=-=-=-=-=-=-=-=-=-=-=-=-=-= 3....

2022-05-01 · 1 分 · Me