본문 바로가기

ctf

[CodeGate 2014 CTF] 4stone

file 명령을 통해 ELF 32bit 바이너리인 것을 확인할 수 있다. 


실행을 하면 다음과 같이 4목 두는 게임이 실행된다. 로컬에서 바로 실행할 수 있다.



ida를 통해 바이너리를 열어보니 ncurses로 만들어진 프로그램인 것을 확인할 수 있었다.

우선 코드를 살펴보면, 4목에서 이길 경우 몇 초만에 이겼는지 출력한다. 

만약 0초 일 경우 입력을 받고, 0x8040000, 0xB0000000 주소를 필터링한 다음 필터링을 통과하면 임의의 메모리 주소에 4byte 데이터를 쓸 수 있게된다. 위에서 필터링하고 있는 주소는 바이너리 주소와 스택 영역의 주소로 그 외의 다른 영역을 써야 한다.

ulmit -s unlimited 명령을 통해 라이브러리 주소를 고정할 수 있다.(로컬에서만!)


따로 방어기법이 적용되어있지는 않다.


스택영역과 바이너리 영역은 필터링으로 사용할 수 없기에 그 외에 rwx 권한이 있는 곳이 있는 곳을 찾아서 넣어주기로 했다.


argv[1] 인자에 0x40076000 을 넣고, 입력받는 부분을 0x12345678 을 넣고 디버깅하니 각각의 값이 eax, edx에 들어가 있다.

그리고 지금 eip가 0x123fe7c0 을 가리키고 있다. 저 주소는 0x12345678 + 0xb90e8 한 주소 값이다.

즉, 변조할 eip 주소 - 0xb90e8 을 한다면 eip를 컨트롤 할 수 있다.


input 값을 받기 위한 argv[1] 인자 주소로 0x40076000 영역으로 지정한 했다. input 값에 쉘 코드가 있는 주소를 넣음으로써 쉘코드를 실행하도록 해야 한다. 이를 위해 환경변수에 nop + shellcode 를 넣고 계속 돌렸다..


인내심을 가지고 돌리니 다음과 같이 쉘코드가 동작한다..

'ctf' 카테고리의 다른 글

[CodeGate 2015 CTF] systemshock  (0) 2016.07.30
[CodeGate 2015 CTF] yocto  (0) 2016.07.06
[CodeGate 2014 CTF] dodoCrackme  (0) 2016.06.11
[Plaid 2013 CTF] pork  (0) 2016.06.03
[CodeGate 2014 CTF] nuclear  (0) 2016.04.19