본문 바로가기
[ ★ ]Study/War Game

[Toddler's Bottle] pwnable.kr leg 풀이

by nroses-taek 2017. 9. 15.
반응형


 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <fcntl.h>
int key1() {
    asm("mov r3, pc\n");
}
int key2() {
    asm(
    "push        {r6}\n"
    "add        r6, pc, $1\n"
    "bx        r6\n"
    ".code   16\n"
    "mov        r3, pc\n"
    "add        r3, $0x4\n"
    "push        {r3}\n"
    "pop        {pc}\n"
    ".code        32\n"
    "pop        {r6}\n"
    );
}
int key3() {
    asm("mov r3, lr\n");
}
int main() {
    int key=0;
    printf("Daddy has very strong arm! : ");
    scanf("%d"&key);
    if( (key1()+key2()+key3()) == key ) {
        printf("Congratz!\n");
        int fd = open("flag", O_RDONLY);
        char buf[100];
        int r = read(fd, buf, 100);
        write(0, buf, r);
    } else {
        printf("I have strong leg :P\n");
    }
    return 0;
}
cs
 
핵심은
key1 + key2 + key3 = 우리가 입력한
입니다.
문제를 풀기위해서는 ARM 어셈블리를 알고있어야 한다.

2포인트 짜리지만 시간이 걸렸다 공부하는데 있어서…
(사진은 클릭하면 잘보여요) 문제를 푸는데 있어서 가장 중요한 핵심입니다.
PC(Program Counter) : CPU 현재 실행하고 있는 instruction 주소를 가리킵니다.
PC 항상 Fetch하고 있는 곳을 가리키고 있습니다. 32bit기준 +8 위치를 가리키고 있다고 있습니다. 
또한, 아래 코드를 보시죠.


key1 ~ key3 아래 칸들을 자세히 보시면, r0 레지스터가 r4, r3에 값 들을 move합니다.
즉, r0가 리턴 값이므로 각 함수에서 어떤 값들을 반환하는지 잘 봐야겠습니다.


key1 에서는 r0 값을 리버싱해보면
mov r3, pc
mov r0, r3
pc값을 r3 넣고 r3 r0 넣어서 리턴합니다
pc 위에서 말했 듯이 Fetch 가리키고 있다고 했다.
, 8cdc부터 2 앞으로 보면 8ce4 되겠다.
key1 값은 0x8ce4.


key2 같은 원리다.
r0부터 리버싱하면, r3 추적하면 된다.
+20 위치에서 pc r3 mov하고 있다.
하지만 여기서 중요한 .
PC+8 r3들어간다 라고 생각하실텐데,
add r6, pc, #1
bx r6 부분에서 thumb mode 바뀌게 됩니다.
(추가로 공부하시려면 모드가 2가지 있는데, 그것도 공부해보시길 추천합니다.)
, 다시 본론으로 들어가서 thumb mode 에서 PC 최근 주소에서 +4 저장됩니다.
0x8d04 + 4 되겠고,
adds r3, #4 +4 되겠습니다.
#뒤에 숫자는 상수인거 아시죠 ? 공부하셨으리가 믿습니다.
결과적으로 key2에서는 0x8d04 + 4 +4 = 0x8D0C 되겠습니다.


key3 입니다.
마찬가지로 r0 들어가는 값이 r3, 이것을 되돌아가보면, lr이라는 값이 있는데,
이는 r14로서 함수 호출시 리턴 주소를 가지고 있습니다. , 메인에서 key3함수를 불렀으니,
메인 함수를 봐야 합니다.


설마 8d7c 부분이라고 하시는 없으셨길 바랍니다.
0x8d80 되겠습니다

key1 + key2 + key3 값을 합치면

0x8ce4 + 0x8d0c + 0x8d80 = 0x1A770 = 108400

입니다.



반응형

댓글