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 |