쿼드콥터 제작기 03 - 안드로이드-아두이노 통신

Posted by dw0rdptr
2015. 7. 11. 04:16 IoT/QuadCopter

처음 계획은 안드로이드->아두이노로 블루투스를 이용해 통신하려고 했는데 블루투스 통신거리가 100미터밖에 안돼 모자란 감이 있어 

1km까지 통신가능한(실제로는 6~700m정도 될듯) RF통신모듈로 아두이노 나노를 거쳐 통신하는 방법을 찾았다

Android -----> Arduino nano -----> Arduino Uno(나중에 Rpino로 교체)

         serial                 APC220


출처- http://yogibotics.blogspot.kr/2013/02/arduino-android-apc220-rc-car.html


APC220 스펙

개요

  • APC220 라디오 모듈은 무선 데이터 통신을 위한 간단한 솔루션입니다.
  • 고속 마이크로프로세서를 탑재하여 UART/TTL 인터페이스를 제공하며, 패킷화 및 데이터 인코딩을 처리합니다.
  • 개활지에서 약 1000m 거리에서 통신이 가능합니다.

특징

  • Transmit distance up to 1000m (line of sight) @9600 bps
  • 256 bytes data buffer
  • High sensitivity (-112dbbm @9600 bps)
  • GFSK modulation
  • UART/TTL interface
  • Embedded watch dog
  • Size: 37x17x6.5 mm

구성품

  • APC220 module(2 units)
  • Antenna for radio communication(2 units)
  • USB to TTL Converter (CP210) (1 unit)



그냥 편하게 RC조종기랑 수신기를 사면 편하지만 이왕 만드는거 고생 제대로한번 해보자는 생각으로 구현해보려고 한다

안드로이드에서는 자이로센서를 이용해 쿼드가 나아가는 방향을 컨트롤하고 카메라로 영상송출은.. 일단 띄우고 생각해보자


-----10/9 추가-----

다른 분 블로그에서 시리얼브릿지 역할을 하는 아두이노 나노없이 apc220모듈과 안드로이드 디바이스를 직접 연결 할 수 있다고 한다.

조만간 시도해볼 예정













[LOB] nightmare -> xavious

Posted by dw0rdptr
2015. 6. 27. 21:31 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
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
 
main()
{
    char buffer[40];
    char *ret_addr;
 
    // overflow!
    fgets(buffer, 256, stdin);
    printf("%s\n", buffer);
 
    if(*(buffer+47== '\xbf')
    {
        printf("stack retbayed you!\n");
        exit(0);
    }
 
    if(*(buffer+47== '\x08')
        {
                printf("binary image retbayed you, too!!\n");
                exit(0);
        }
 
    // check if the ret_addr is library function or not
    memcpy(&ret_addr, buffer+444);
    while(memcmp(ret_addr, "\x90\x90"2!= 0)    // end point of function
    {
        if(*ret_addr == '\xc9'){        // leave
            if(*(ret_addr+1== '\xc3'){    // ret
                printf("You cannot use library function!\n");
                exit(0);
            }
        }
        ret_addr++
    }
 
        // stack destroyer
        memset(buffer, 044);
    memset(buffer+4800xbfffffff - (int)(buffer+48));
 
    // LD_* eraser
    // 40 : extra space for memset function
    memset(buffer-300003000-40);
}
cs


쓸수 있는게 별로없다.

스택사용불가, leave ret사용불가, 라이브러리사용불가, LD_PRELOAD 사용불가

뭘쓰라는거야



stdin 임시입력버퍼 찾으면됨


strace ./xavius로 찾아보면 mmap으로 메모리 공간 확보하고 read()로 입력받는다
-> fets()는 read()를 사용한다.
-> 확보된 메모리공간 찾아가보면 입력받은 string이 남아있을 것.



페이로드와 Password


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

[LOB] succubus -> nightmare  (0) 2015.06.01
[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

쿼드콥터 제작기 02 - 아두이노IDE, 모터구동테스트

Posted by dw0rdptr
2015. 6. 27. 04:24 IoT/QuadCopter

하비킹에서 산 파워분배기에 배터리를 연결했더니 타는냄새가 나서 얼른 이베이에서 새 파워분배기를 구매했다. 다행히 늦지 않게 와서 금방 납땜하고 다음단계로 넘어갈 수 있었음


일단 아두이노 우노를 당분간 쓸 예정..

아두이노에 프로그래밍을 하려면 아두이노 통합개발환경(IDE)가 필요하다 아두이노 공식 홈페이지에 있으니 다운받자

스케치라는 개발 언어를 사용하는데 c와 많이 다르지 않다


모터가 잘 돌아가는지 구동테스트부터 하자


모터 구동코드


아두이노에 업로드 후 PWM 9번과 GND에 각각 ESC 핀을 연결

*프로펠러 장착하지 말고 테스트합시다




모터구동 테스트



아 기말고사가 코앞인데 이걸 놓을수가없다ㅠㅠ

[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

쿼드콥터 제작기 01 - 부품주문, 조립

Posted by dw0rdptr
2015. 5. 31. 03:36 IoT/QuadCopter

중간고사 끝나자마자 수학여행, 체육대회가 겹치니까 정신이 없어 그동안 부품이도착해도 조립할 엄두를 못냈다.. 아무튼 다시 속도내보자


 

컨트롤보드(라즈베리파이2,아두이노 쉴드 Rpino) 

프레임(550mm 카본프레임)

BLDC 모터

ESC(변속기)

파워분배기

배터리(4000mah 이상으로 예정),배터리 충전기

프로펠러(10x4.7프롭)

가속도, 자이로센서(MPU-9250 or GY-86)

라즈베리파이 카메라 모듈

+ 배터리 셀 체커


사다보니 좀 많아지긴 했다.. 싸니까 이것저것 사게되는듯한데 가격은 모두 약 325달러, 우리돈으로 36만원쯤되는듯 (아두이노+라즈베리파이 제외)

아오ㅠㅠ 시즌준비 하려면 장비도 사야되고 시즌권도 사야돼서 돈모아놔야 되는데 예상했던것보다 더 많이 써서 출혈이 크다 ㅁㄴㄹㅇ


현재 배터리와 충전기 제외한 부품 배송완료 

센서는 이베이에서 싸게샀는데 2주는 더 걸릴 것 같다 


기본 프레임조립+모터와 프롭 조립 후 ESC와 커넥터납땜(절연테이프로 마감), 파워분배기

모터 프롭 악세서리 하나가 규격이 안맞아서 동네 철물점에서 깎아옴.. 납땜도 너무 오랜만에 해서 어설프게됐다



앞으로 할게 많은데 2학기 시작전에 끝낼수나 있으려나.. 안드로이드도 천천히 배워놓아야겠다.


*8월15일 추가 - 이분 반도 못하셨다고 합니다


쿼드콥터 제작기 00

Posted by dw0rdptr
2015. 5. 2. 02:47 IoT/QuadCopter

중간고사도 끝나서 전부터 생각해뒀던 라즈베리파이 쿼드콥터를 만들어보려고한다


필요한 부품 

컨트롤보드(라즈베리파이2,아두이노 쉴드 Rpino)

프레임(550mm 카본프레임)

BLDC 모터

ESC(변속기)

파워분배기

배터리(4000mah 이상으로 예정),배터리 충전기

프로펠러(10x4.7프롭)

가속도, 자이로센서(MPU-9250 or GY-86)

카메라 모듈(추후 추가예정)

-------------------------

BEC : 구상하면서 떠오른 건데 컨트롤보드에 전원공급은 어떻게하지 생각했었다. 찾아보니 ESC의 전원핀을 연결하면 된다고 한다. 하지만 출력을 급격히 높힐 때 등 배터리 사용이 많아지면  ESC가 컨트롤 보드로 전원을 제대로 공급해 주지 못한다고 해 따로 배터리와 컨트롤보드를 직접 연결해주는 BEC를 사용하는게 더 낫다고는 한다.


자세제어 알고리즘을 직접 구현해볼 생각이다(물론 여기저기 참고해서) 스마트폰이나 태블릿으로 조종할 예정이고 통신은 블루투스로 생각중인데 100m 통신거리가 조금 짧은 것 같아서 지그비도 고려중

필요한 기본지식부터 찾아봤는데 알아야할게 너무 많은것같다.. 시간여유는 많으니 천천히 배워가면서 해야겠다


필요한 부품 대부분은 하비킹이랑 이베이에서 구입할 예정. 국내사이트랑 비교해봤는데 가격이 싸다 관세, 배송비를 감안해도 싼편



찾아보니 라즈베리파이는 클럭수가 높아 연산은 빠르지만 센서값을 받아오고 모터를 제어하는 데는 아두이노가 좋아 최소 3ms 주기로 자세제어를 해야하는 멀티콥터 등에는 아두이노를 많이 쓰는 것 같다

하지만 영상처리를 하려면 아두이노로는 턱없이 부족하다. 그래서 라즈베리파이2+아두이노 Rpino 조합을 쓰려고 한다.



* 아두이노와 라즈베리파이의 차이점

요약 (3:00부터) - 아두이노는 '제어'에 특화된 보드. 라즈베리파이는 '처리'에 특화된 보드.

모터를 제어하는 멀티콥터에는 아두이노가 더 적합



** 쿼드콥터 스펙계산

http://www.ecalc.ch/xcoptercalc.php?ecalc&lang=en



[LOB] zombie_assassin -> succubus

Posted by dw0rdptr
2015. 4. 30. 16:38 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
        The Lord of the BOF : The Fellowship of the BOF
        - succubus
        - calling functions continuously 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <dumpcode.h>
 
// the inspector
int check = 0;
 
void MO(char *cmd)
{
        if(check != 4)
                exit(0);
 
        printf("welcome to the MO!\n");
 
    // olleh!
    system(cmd);
}
 
void YUT(void)
{
        if(check != 3)
                exit(0);
 
        printf("welcome to the YUT!\n");
        check = 4;
}
 
void GUL(void)
{
        if(check != 2)
                exit(0);
 
        printf("welcome to the GUL!\n");
        check = 3;
}
 
void GYE(void)
{
    if(check != 1)
        exit(0);
 
    printf("welcome to the GYE!\n");
    check = 2;
}
 
void DO(void)
{
    printf("welcome to the DO!\n");
    check = 1;
}
 
 
 
main(int argc, char *argv[])
{
    char buffer[40];
    char *addr;
 
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
 
    // you cannot use library
    if(strchr(argv[1], '\x40')){
        printf("You cannot use library\n");
        exit(0);
    }
 
    // check address
    addr = (char *)&DO;
        if(memcmp(argv[1]+44, &addr, 4!= 0){
                printf("You must fall in love with DO\n");
                exit(0);
        }
 
    // overflow!
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
 
    // stack destroyer
    // 100 : extra space for copied argv[1]
    memset(buffer, 044);
    memset(buffer+48+10000xbfffffff - (int)(buffer+48+100));
 
    // LD_* eraser
    // 40 : extra space for memset function
    memset(buffer-300003000-40);
}
cs

소스가 길어졌다... 힌트를 보면 calling functions continuously, 함수 연속호출을 뜻하는것 같다


전역변수로 check를 선언한다

공유라이브러리를 사용할 수 없고, ret가 함수 DO의 주소가아니면 종료해버린다.

DO,GYE,GUL,YUT,MO를 연속적으로 호출해 함수MO의 system함수로 쉘을 실행시키자


ret에 DO의 주소를 덮으면 DO가 호출된다. ret로 호출된 함수는 그 함수의 ret가 생성되지 않기 때문에 바로 다음함수인 GYE의 주소를 덮어쓴다. 이런식으로 먼저 MO까지 호출해보자


DO : 0x80487ec
GYE : 0x80487bc
GUL : 0x804878c
YUT : 0x804875c
MO : 0x8048724

-> gdb로 구한 함수의주소

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()]


MO까지 성공적으로 호출했다. MO는 *cmd를 인자로 받는데 공유라이브러리를 쓰지 못하니 argv[1]에 /bin/sh를 쓰고 주소를 구해 전달하자

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()][dummy(4bytes)][&/bin/sh][/bin/sh]


먼저 core를 떨어트려 주소를구하자

[ buffer+sfp(44bytes) ][DO()][GYE()][GUL()][YUT()][MO()][AAAA][BBBB][CCCC]

/bin/sh 가 들어갈 주소인 0xbffffa68이 $/bin/sh이다


페이로드와 Password



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

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

[LOB] assassin -> zombie_assassin

Posted by dw0rdptr
2015. 4. 18. 03:01 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
/*
        The Lord of the BOF : The Fellowship of the BOF
        - zombie_assassin
        - FEBP
*/
 
#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);
        }
 
    // strncpy instead of strcpy!
    strncpy(buffer, argv[1], 48); 
    printf("%s\n", buffer);
}
cs


소스를보면 strncpy로 인자가 48바이트로 제한돼 ret까지밖에 덮지 못한다. 이렇게 스택과 라이브러리를 필터링하고 ret이후로 덮어쓸 수 없을 때 fake ebp 기법을 활용한다


fake ebp란 sfp에 buffer-4의 주소를 덮어 ebp를 버퍼주소로 옮기고 ret에 leave주소를 덮어 함수 에필로그 과정을 한번 더 수행해 sfp를 변조해 만든 가짜 ebp로 esp가 가게 만들어 우회하는 기법이다. buffer-4 인 이유는 leave를 한번 더 수행할 때 pop ebp 과정으로 인해 esp+4가 되기 때문에 버퍼의 시작주소에 맞추기 위함이다


[system()][dummy(or exit())]["/bin/sh"][28byte dummy][buffer-4][leave]

                                                                                 ↓         ↓

                                                                                sfp       ret


system()과 /bin/sh 주소구하는 방법 전레벨과 같으므로 생략

buffer-4와 leave의 주소를 구하자


leave : 0x80484df

buffer-4 : 0xbffffa60-4 = 0xbffffa5c

[0x40058ae0][AAAA][0x400fbff9][AAA...AA(28byte)][0xbffffa5c][0x80484df]


페이로드와 Password


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

[LOB] succubus -> nightmare  (0) 2015.06.01
[LOB] zombie_assassin -> succubus  (0) 2015.04.30
[LOB] giant -> assassin  (0) 2015.04.14
[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12

[LOB] giant -> assassin

Posted by dw0rdptr
2015. 4. 14. 17:22 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
        - assassin
        - no stack, no RTL
*/
 
#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로 ret에 스택과 공유라이브러리 주소를 쓰지 못하게 됐다


하지만 ret에 ret주소를 덮게되면 esp+4에 있는 주소를 실행해 우회할 수 있다.

[ret주소][system()주소][dummy]["/bin/sh"] 이렇게 페이로드를구성한다면


higher address

----------

   /bin/sh

----------

   dummy

----------

    system

------------

       ret

------------  <- esp

lower address

ret가 pop eip, jmp eip 명령을 수행한다는것은 알고 있을것이다.

pop eip를 할 때 eip에 ret주소가 들어가고 jmp eip를하면 ret로 돌아오지만 esp는 pop명령으로 인해 +4가 되어 있는 상태다


higher address

----------

   /bin/sh

----------

   dummy

----------

    system

------------ <- esp

       ret

------------  

lower address


현재 ret주소로 다시 돌아왔으니 ret명령이 또한번 수행된다

pop eip, jmp eip를 수행하면 eip에는 system함수의 주소가 들어가고, jmp로 system함수를 실행해 /bin/sh가 실행된다



gdb로 main함수에서 ret주소를 찾자

ret : 0x804851f

system() : 0x40058ae0

/bin/sh : 0x400fbff9

system함수와 /bin/sh를 구하는 방법은 전레벨에서 설명이 되어있으니 건너뛰겠다



페이로드와 Password


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

[LOB] zombie_assassin -> succubus  (0) 2015.04.30
[LOB] assassin -> zombie_assassin  (0) 2015.04.18
[LOB] bugbear -> giant  (2) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12
[LOB] golem -> darkknight  (0) 2015.04.11

[LOB] bugbear -> giant

Posted by dw0rdptr
2015. 4. 14. 16:34 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
37
38
39
40
41
42
43
44
45
46
/*
        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

코드가 복잡해졌다. execve의 주소를 구하고 ret를 execve함수의 주소로 덮어쓰지 않으면 프로그램이 종료된다


execve는 호출한 프로세스를 새로운 프로세스로 변경한다. 이때 환경변수 정보를 추가 가능하다


프로토타입

execve (const char *filename, char *const argv[], char *const envp[])

첫번째 인자 : 실행시킬 파일명

두번째 인자 : 전달할 인자값 (포인터배열)

세번째 인자 : 환경변수 (NULL을 주면됨)


ret에 execve의 주소를 덮으면

(lower address) [execve()][execve의 ret][인자1][인자2][인자3] (higher addess)


[execve()][system()][exit()]["bin/sh"][NULL]

execve함수로 exit함수를 실행하면 바로 종료해버리면서 ret에있는 system함수를 실행하고 두번째 인자로 전달한 /bin/sh이 실행된다.


system() : 0x40058ae0

execve() : 0x400a9d48

exit() : 0x400391e0

NULL : 0xbffffffc (스택끝부분에 있는걸 씀)

/bin/sh : 0x400fbff9 ( darkknight에서 구한 주소)



페이로드와 Password


*exit주소를 쓰지 않고 dummy로 채워도 쉘을 딸 수 있지만 dummy로 채웠을 경우 쉘을 나가면 세폴 오류가 뜬다는 차이점이 있다

 


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

[LOB] assassin -> zombie_assassin  (0) 2015.04.18
[LOB] giant -> assassin  (0) 2015.04.14
[LOB] darkknight -> bugbear  (0) 2015.04.12
[LOB] golem -> darkknight  (0) 2015.04.11
함수의 프롤로그(prologue) 및 에필로그(epilogue)  (0) 2015.04.10