반응형
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포인트 짜리지만 시간이 좀 걸렸다 공부하는데 있어서…
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
입니다.
반응형
'[ ★ ]Study > War Game' 카테고리의 다른 글
[Toddler's Bottle] pwnable.kr shellshock 풀이 (0) | 2017.09.15 |
---|---|
[Toddler's Bottle] pwnable.kr mistake 풀이 (0) | 2017.09.15 |
[Toddler's Bottle] pwnable.kr input 풀이 (0) | 2017.09.13 |
[Toddler's Bottle] pwnable.kr random 풀이 (0) | 2017.08.17 |
[Toddler's Bottle] pwnable.kr passcode 풀이 (2) | 2017.08.17 |
댓글