CTF | wargame

hdcon 2016 / runme (mips 프로그램 실행)

nopdata 2018. 2. 27. 21:35
mips 가상머신을 돌리려고 하다 보니 mips 관련 문제 풀이로 이어져서 풀어보게 되었다. ref : http://kblab.tistory.com/328

qemu는 1712 최신버전으로 먼저 받고 링크 페이지에 필요한 파일들을 받고 배치파일을 생성한다.

qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -redir tcp:4444::22 -nographic
mips.bat

파일 공유 부분은 가지고있던 vm웹으로 전송하는 형태로 사용하였다. 뭐...

runme 문제 자체가 mips상에서 실행하면 되는 프로그램이다.

[ runme 실행 ]

일단 root로 실행을 시키면 안된다. 다른 계정으로 실행을 시켜보면 문자가 1개씩 나오는데 너무 오래걸린다... 아무래도 sleep이 걸린듯 싶었다. 풀이를 보면 그냥 기다렸다고 하는데 sleep 정도면 없애버리면 될 것 같았다.

[ runme - sleep(?) ]

sleep이 사용되는 부분을 찾아가면 위와 같다. mips에 대한 지식이 전혀 없기 때문에 막무가내로 이것저것 건드려봤다.
lw, sw는 load, stor라는 것은 이해했고... sleep을 호출하는 jalr 명령은 다음과 같다.


jalr 명령어
jalr r     # $ra <— PC+4  $ra <— return address
           # PC  <— $r    load the PC with the address in $


이 부분만 해결하면 되니 간단하게 생각하면 일단 sleep call이라고 보면 될 것 같다. 다음으로는 sleep의 파라미터 부분을 0으로 바꾸는 것이 목표다.
프로그램 동작을 보면 sleep의 속도가 일정하지 않은 것으로 보아 고정값이 아닌 듯 하였다.

위에 bp를 건 부분을 보면 move $a0, $v0가 존재한다. 보통 return에 eax를 사용하듯이 여기서도 a0의 사용위치를 보면 비슷한 역할을 하는 듯 하다.
그래서, a0에 0을 넣어 sleep의 속도에 영향이 존재하는지 판단해 보기로 했다.

바이너리를 직접 바꾸려면 조금 더 알아야 할 듯....

일단 move $a0, $v0의 hex값은 25204000이다.
1, 3번째 값을 바꾸면 명령어쪽이, 2,4번째를 바꾸면 각각 위치값이 바뀌는 듯 하였다. 하나씩 건드려 보다가
25210000으로 바꾸니 원하는 대로 명령어가 바뀌게 되었다.

[ runme - sleep(0) ]

결과는 예상한 결과 대로 동작하였다.

[ runme_mod - 결과 ]

flag : flag is {Did you watched CSI Las Vegas???. Because, I Like CSI Las Vegas. Sepecialally, Gil_Griss0m. I think he Is very smart!. And Science is suprisE me. But, I can't watch CSI Las Vegas anymore T_T. BecausE, CSI is the END..}