system hacking

해커스쿨 lob 1단계 (gate - gate)

leesu0605 2022. 4. 9. 22:47

- 코드 분석

int main(int argc, char *argv[])
{
    char buffer[256];  //크기가 256인 char형 배열 buffer 선언
    if(argc < 2){  //프로그램에 전달된 인자의 개수가 2이상이라면
        printf("argv error\n");  //에러를 출력하고 프로그램 종료
        exit(0);
    }
    strcpy(buffer, argv[1]);  //프로그램에 전달된 첫 번째 인자를 buffer에 복사
    printf("%s\n", buffer);  //버퍼 출력
}

요약 : "실행 시 전달된 인자를 출력하는 프로그램"

취약점 : "strcpy 함수에서 인자로 전달된 문자열을 길이제한을 걸지 않고 메모리에 모두 복사해버리기 때문에 다른 메모리 영역을 침범할 수 있다"


- 페이로드를 짜기 전 사전 작업

1. 권한 에러 방지를 위해 cp 명령어로 프로그램을 복사한 후 gdb로 분석

2. 배열에 dummy값이 생성되지 않았음을 확인 가능

0x804845f <main+47>:    lea    %eax,[%ebp-256]
0x8048465 <main+53>:    push   %eax
0x8048466 <main+54>:    call   0x8048370 <strcpy>

3. gdb의 b 명령어로 프로그램 맨 마지막 (*main+79)에 브레이크 포인트를 걸고, r 명령어로 프로그램 실행한 후, x 명령어로 esp 부근을 확인해 입력한 값이 어디부터 채워져 있는지 확인

*사람마다 다르게 나올 수 있음

(gdb) b *main+79
Note: breakpoint 1 also set at pc 0x804847f.
Breakpoint 2 at 0x804847f
(gdb) r `python -c 'print "A"*90'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/gate/gremlin1 `python -c 'print "A"*90'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Breakpoint 1, 0x804847f in main ()
(gdb) x/30x $esp
0xbffffb80:     0x080484ec      0xbffffb88      0x41414141      0x41414141
0xbffffb90:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffba0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffbb0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffbc0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffbd0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffbe0:     0x4000*4141      0x400143e0      0xbffffc6c      0x400261a6
0xbffffbf0:     0x4001ead0      0x400143e0

* 리틀 엔디언 구조이므로 값이 뒤에서부터 한 바이트씩 채워짐

- 위의 경우 0xbffffb88이 buffer의 시작점이라는 것을 알 수 있음


- 페이로드 짜기

1. 충분한 양의 NOPSLED 넣기

2. 쉘코드 넣기

3. '256-NOPSLED길이-쉘코드의 길이+4(SFP)'만큼 NOPSLED 추가하기

4. buffer의 시작 주소 넣기