DongDD's IT

[LOB] Level15 giant 본문

Wargame/LOB

[LOB] Level15 giant

DongDD 2018. 1. 30. 16:35

[LOB] Level15 giant


Problem



이번 문제도 assassin 실행 파일과 assassin.c 소스 코드 파일이 있었다.

먼저 소스 코드를 확인해보았다.


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
#include <stdio.h>
#include <stdlib.h>
 
main(int argc, char *argv[])
{
        char buffer[40];
 
        if(argc < 2){
                printf("argv error\n");
                exit(0);
        }
 
        if(argv[1][47== '\xbf')
        {
                printf("stack retbayed you!\n");
                exit(0);
        }
 
        if(argv[1][47== '\x40')
        {
                printf("library retbayed you, too!!\n");
                exit(0);
        }
 
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
 
        // buffer+sfp hunter
        memset(buffer, 044);
}
 
cs


소스 코드 맨 위의 힌트에는 "no stack, no RTL"라는 메시지가 적혀있었다.

buffer는 40 bytes이고 argv를 입력받아야 한다.

이번에는 argv[1]의 48번째 글자가 "/xbf"가 아니어야 한다. 즉,  stack 영역의 변수를 사용하면 안된다는 의미같다.

그리고 추가된 부분이 argv[1]의 48번째 글자가 "/x40"도 아니어야 한다는 것이다. 즉, libc에 있는 0x40으로 시작하는 주소인 library들의 함수들을 사용하지 못하게 한다.

그 후에 strcpy를 통해 argv[1]을 buffer에 복사하고 마지막에 buffer와 sfp를 초기화시켜준다.


Solution


처음에는 hint에 써있는 "no stack, no RTL"을 보고 stack도 사용못하고 RTL도 사용못하면 0x8048000의 주소에서 무엇을 찾아서 해결해야 할 것 같다는 생각이 들어 gdb를 통해 모든 값들을 봤지만 마땅히 사용할 수 있을 것 같은 값이 없었다.

풀 방법이 생각나지 않다가 문득 RTL이 다시 떠올랐다. RTL을 사용해 해결할 수 있었고 hint를 안보는 게 더 나을 수도 있다는 생각이 들었다.


1. Return to Library(RTL)


RTL로 간단히 해결할 수 있는 문제였지만 hint 때문에 시간이 좀 걸렸던 것 같다.


먼저 ldd를 통해 assassin 파일을 확인해보니 ASLR은 걸려있지 않았고 단순히 return address가 "\x40"인지만 확인한다는 것을 알 수 있었다.



먼저 gdb를 통해 main에 break point를 잡고 system()함수의 주소와 프로그램을 작성해 "/bin/sh"의 주소를 알아내었다.


system() 함수의 주소 : 0x40058ae0

"/bin/sh"의 주소 : 0x400fbff9




그 다음에는 전 문제에서 했던 방식으로 시도해보려고 했다.


Payload = dummy(44 bytes, "A"*44) + return address1(4 bytes, ??) + return address2(4 bytes, system()함수 주소, 0x40058ae0) + dummy(4 bytes) + argument1(4 bytes, "/bin/sh"의 주소, 0x400fbff9)



return address에 처음에 무엇을 넣어야 할지 몰라서 printf()와 exit() 함수 등 프로그램 내에서 쓰였었던 함수들을 넣어보았지만 printf()함수를 넣었을 때는 segmentation fault가 떴고 exit()함수를 넣었을 때는 그냥 프로그램이 종료되었다.

그 후에도 leave가 위치한 0x804851d를 넣어보았지만 실패했다.


그런데 gdb를 계속 보다가 0x804851f에 nop이 있는 것을 볼 수 있었고 이 값을 한번 넣어보았더니 문제에 통과할 수 있었다.


이 문제를 해결된 이유가 return address에 위치한 것이 NOP이라 그냥 넘어가서 system() 함수가 실행되는 건지 아니면 전 문제에서 썼던 방식대로 return address가 종료되고 두 번째의 return address인 system()함수가 실행되는 건지는 정확히는 모르겠다.

그런데 printf()나 exit()를 넣었을 때 실행되지 않았던 것을 보면 전자인 것 같은데 왜 printf()와 exit()함수로 했을 때는 실행되지 않는 지는 의문이다.


추후에 RTL에서 다시 공부하면서 어느 정도 파악했는데 아마 plt값이라 아마 실행되지 않는 것 같았다.

그러나 got를 쓰기에는 "\x40"으로 시작하는 주소를 갖기 때문에 사용할 수 없는 것 같다.




**************     Answer & Flag     **************


1. Return to Library(RTL)


Payload = dummy(44 bytes, "A"*44) + return address1(4 bytes, NOP이 위치한 주소, 0x0804851f) + return address2(4 bytes, system()함수 주소, 0x40058ae0) + dummy(4 bytes) + argument1(4 bytes, "/bin/sh"의 주소, 0x400fbff9)


argv[1] = "A"*44 + "\x1f\x85\x04\x08" + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40"




Next ID : assassin

Next PW : pushing me away

'Wargame > LOB' 카테고리의 다른 글

[LOB] Level17 zombie_assassin  (0) 2018.01.31
[LOB] Level16 assassin  (0) 2018.01.31
[LOB] Level14 bugbear  (0) 2018.01.27
[LOB] Level13 darkknight  (0) 2018.01.26
[LOB] level12 golem  (0) 2018.01.25
Comments