[LOB] succubus -> nightmare

Posted by dw0rdptr
2015. 6. 1. 21:44 System/LOB
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

빨리 LOB끝내고 pwnable.kr를 풀어야하므로 간단하게 정리한다


ret주소엔 strcpy(*dst, *src)주소인지 확인한다. 그리고 아래 memset은 strcpy()의 ret를 AAAA로 초기화시킨다.

[buffer][sfp][ret(strcpy@plt)][AAAA(strcpy()의 ret)][dest][src]


페이로드는
argv[1] : [buffer][sfp][strcpy()][AAAA][&AAAA][argv[2]]
argv[2] : [system()][BBBB or exit()][/bin/sh]


strcpy()함수를 사용해 AAAA로 초기화되어있는 strcpy()의 ret주소에 argv[2], system()함수가 있는 두번째 인자값을 복사한다.

strcpy함수가 종료되면서 ret에 의해 argv[2]로 뛰면 성공


&AAAA(strcpy() ret)와 argv[2]의 주소를 구하면 끝. 주소는 소스코드를 수정해 구함


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dumpcode.h>
 
main(int argc, char *argv[])
{
        char buffer[40];
        char *addr;
        printf("buffer:%p\n",buffer);
        printf("argv[2]:%p\n",argv[2]);
 
        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

 - 수정된 코드



&AAAA : 0xbffffa60+44= 0xbffffa90

argv[2] : 0xbffffc22


페이로드와 Password



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

[LOB] nightmare -> xavious  (1) 2015.06.27
[LOB] zombie_assassin -> succubus  (0) 2015.04.30
[LOB] assassin -> zombie_assassin  (0) 2015.04.18
[LOB] giant -> assassin  (0) 2015.04.14
[LOB] bugbear -> giant  (2) 2015.04.14