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..}
'CTF | wargame' 카테고리의 다른 글
DFChallenge 2021 / 301 - What is the secret information (0) | 2021.05.23 |
---|---|
RPISEC 연습문제 / crackme0x0?? (기초 리버싱, radare2 연습) (2) | 2018.02.27 |
labyrenth 2017 / Mobile 2 - routerlocker (mips 리버싱, gdb set follow-fork-mode child) (0) | 2018.02.27 |
labyrenth 2017 / Mobile 1 - Ezdroid(안드로이드 코드 리버싱, 자바 연산상 오류 ) (0) | 2018.02.27 |
radare2 / sym 파싱 오류, sym to str (0) | 2018.02.26 |