본문 바로가기

Computer Security/CTF

[Holyshield 2012] Packet 1번 문제풀이

먼저, 파일이 pcap 파일이라는것 정도는 간단히 알수 있으므로, 와이어샤크로 열어보았습니다.

 

그리고 쭉 내려보면 telnet이 많이 보이고,

오른쪽 클릭해서 'follow tcp stream'을 통해서 보면, 텔넷으로 원격접속을 한것을 알수있습니다.

 

그러면 우선 텔넷 패킷들만 필터링하기 위해서 filter에 "tcp.port == 23" 으로 패킷 필터링을 합니다.

 

그러면 대충 나오는 아이피가

 

10.10.60.173

10.10.60.102

10.10.60.64

10.10.60.90

 

정도가 나오고, 10.10.60.102가 서버 아이피라는것은 간단히 알수있습니다.

 

그중 10.10.60.64의 tcp stream을 살펴보면

 

 

.ackcat","\x40\x8a\xff\xbf\n"x.[C
.ackcat","\x40\x8a\xff\xbf\n"x4.[C
.ackcat","\x40\x8a\xff\xbf\n"x40]]';cat)|../../hello.....................[1P';cat)|../../hello.....................[1P';cat)|../../hello.....................[1P';cat)|../../hello.....................[1P';cat)|../../hello.....................[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[D..[C
.ackcat","
.ackcat",""\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\\"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\xx"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x000"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"
.ackcat","\x00""\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"xx"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"x33"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"x366"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"x36,,"\x40\x8a\xff\xbf\n"';cat)|../../hello
.
.ackcat","\x00"x36,


iidd


uid=0(root) gid=501(blackcat) groups=501(blackcat)

llss


getenv.getenv.c

ccdd  ....


llss


gusals.minyoung  taekonryu  taekonryu.c  testt  testt.c

ccdd  ....


llss


hello  hello.c.key.txt  somedoby_helpme  temp

ccdd.^H.^Hcc.^H.. .. ... ... .. ... .. ... ... ..ccaatt  kkee.....yy..ttxxtt


W4rning_TongSo0!!

 

 

 

뒷부분에 이와 같이 나옵니다.

 

id 명령어를 치니, id가 0으로 나오므로, 루트권한을 획득한것을 알수있고.

 

cat key.txt를 쳤더니 W4rning_TongSo0!! 가 나왔죠.

그러므로 key값은 W4rning_TongSo0!! 입니다.

 

또 버퍼오버플로우를 시도한쪽을 살펴보면, "\x00"x36,,"\x40\x8a\xff\xbf\n "

가 나오죠.

BOF를 어느정도 공부한사람이라면 \x40\x8a\xff\xbf 가 리턴 어드레드라는것을 쉽게 알수있습니다.

 

이걸 정답에 쓰기위해 변환하면 0xbfff8a40 이 되겠죠.

 

또 마지막으로, sfp - buf의 어드레스값을 구하기 위해선, 텔넷 패킷 중간중간에 나오는 gdb 명령어의 결과를 살펴봐야합니다.

 

gdb의 disas main의 결과값을 보시면

 

그중에

 

 0x08048400 <main+24>:.lea    0xffffffb8(%ebp),%eax 

라는 결과가 strcpy에 앞서 있습니다.

 

AT&T 어셈블리에서는 ??(%ebp) 라고 되어있으면 ebp+??의 위치에 있다는뜻인데,

 

여기서는 마이너스이기때문에 0xffffffb8이 나왔습니다. 이걸 마이너스의 형태로 바꾸면, -0x48 (0x100000000 - 0xffffffb8)입니다.

 

즉, buf = ebp - 0x48 이라는것이죠.

 

문제에선 ebp - buf(sfp) 이므로, 정답은 0x48이 됩니다.

 

그러므로 정답은 10.10.60.64_0x48_W4rning_TongSo0!!_0xbfff8a40 입니다.