Phantom

ARMv2 Hand-ray 본문

Pwnable/ARM, MIPS

ARMv2 Hand-ray

Ph4nt0m_ 2018. 7. 5. 21:18
반응형
이번에 해볼 소스는 이것이다.


LOB 1번 gremlin 문제인데 진짜 qemu vi 너무 불편하다 화면이 깨끗이 안지워짐 VIM도 마찬가지 ㅂㄷㅂㄷ

디스어셈블하면 다음처럼 보인다.


한줄 한줄 해석은 했고 이걸 이제 다시 소스화 시켜보자.

ARM의 Calling Convention은 다음과 같다. Refer - 2013 Incognito ARM exploit
R0 ~ R3순서대로 인자 저장
인자가 4개 이상일시 스택을 사용
함수 리턴 값 반환은 R0레지스터를 사용
BL명령으로 호출시 리턴주소는 LR에 저장


r3+#0에 r0값 저장

r0에는 0x2가 있었고 r3+0 에 들어갔다.


r3+#0에 r1 저장 r3에는 r7의 값이 저장되어 있었다.

r3+0 지점에 r1의 값(0x7efffdf4)를 넣는다. 그리고 r1을 참조해보니 /root/gremlin이라는 문자열이 나왔다.

그럼 현재 r0 = 0x2, r1 = 0x7efffdf4(/root/gremlin)


ldr 명령은 r3+#0이 가리키고 있는 곳의 데이터를 r3에 로드한다.
그리고 r3과 1을 비교한다 
CMP 명령은 Rn에서 Rm을 비교한다 SUB연산인데 자세히는 모르겠다.
r3이 클 경우 main+46으로 이동한다.


이부분은 간단하다 #33964는 0x84ac, 이건 주소값인데 문자열이 담겨있었다.
그리고 비트 상위부분에 0을 넣고 blx로 puts함수를 call하여 출력한다.
다시 r0에 0을 넣고 exit를 실행하는 구문인데 위에 것과 합쳐보면

if (r3 < 1){
    printf("argv error\n");
    exit(0);
}
요것이 된다.


r7을 r3에 저장하는데 r7은 초기에 함수 프롤로그때 사용했던 레지스터이다 EBP와 비슷한 역할을 하는것 같다.
r3에 r3을 로드시킨다. 뭐지.. 로드시킨다는게 인자를 넣는다는 기분일까??

r3+#4를 r3에 저장하고 그곳을 로드한다. 두번째 인자인것 같다.
간단히 하자면 r3에 ebp+0 같은 인자. Buffer같다.
두번째 +4하고 로드하는 r3은 ebp+4 같다. 그후 r2를 ebp+8같이 인자를 만들고 r2를 r0에 넣고 r3에 r1을 넣는다.
이게 strcpy(buffer, argv[1])이 되는거 같은데.....ebp+4, ebp+8 하 잘 모르겠다.


함수의 마무리 부분이다.

반응형

'Pwnable > ARM, MIPS' 카테고리의 다른 글

ARMv3 Incognito 2013 GotaShell  (0) 2018.07.06
ARMv1  (0) 2018.07.04
Comments