티스토리 뷰

BOF 원정대 - Level1 gate

1. C 코드 및 어셈블리 확인
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);
}
.text:08048430                 public main
.text:08048430 main            proc near               ; DATA XREF: _start+17o
.text:08048430
.text:08048430 dest            = byte ptr -100h
.text:08048430 argc            = dword ptr  8
.text:08048430 argv            = dword ptr  0Ch
.text:08048430 envp            = dword ptr  10h
.text:08048430
.text:08048430                 push    ebp             ; Alternative name is 'gcc2_compiled.'
.text:08048431                 mov     ebp, esp
.text:08048433                 sub     esp, 100h
.text:08048439                 cmp     [ebp+argc], 1
.text:0804843D                 jg      short loc_8048456
.text:0804843D
.text:0804843F                 push    offset format   ; "argv error\n"
.text:08048444                 call    _printf
.text:08048444
.text:08048449                 add     esp, 4
.text:0804844C                 push    0               ; status
.text:0804844E                 call    _exit
.text:0804844E
.text:08048453 ; ---------------------------------------------------------------------------
.text:08048453                 add     esp, 4
.text:08048453
.text:08048456
.text:08048456 loc_8048456:                            ; CODE XREF: main+Dj
.text:08048456                 mov     eax, [ebp+argv]
.text:08048459                 add     eax, 4
.text:0804845C                 mov     edx, [eax]
.text:0804845E                 push    edx             ; src
.text:0804845F                 lea     eax, [ebp+dest]
.text:08048465                 push    eax             ; dest
.text:08048466                 call    _strcpy
.text:08048466
.text:0804846B                 add     esp, 8
.text:0804846E                 lea     eax, [ebp+dest]
.text:08048474                 push    eax
.text:08048475                 push    offset aS       ; "%s\n"
.text:0804847A                 call    _printf
.text:0804847A
.text:0804847F                 add     esp, 8
.text:08048482                 leave
.text:08048483                 retn
.text:08048483
.text:08048483 main            endp

[!] 참고:
구버전의 bash 인 경우, 프로그램으로 명령 인자값을 전달하는 도중 0xff 문자열을 제대로 인식하지 못하는 문제점이 있으므로, bash2 에서 공격을 실행할 것.

> 공략
프로그램 실행 인자로 받은 문자열을 스택에 길이 제한 없이 받아들이고, Stack canary가 존재하지 않음을 이용해,
스택의 RET (ebp+0x4)를 Overwrite 할 수 있다.

256바이트를 스택에 할당한 다음, 실행 인자가 넘어왔는지 확인하고,
프로그램 실행 인자의 두번째 (프로그램의 인자에는 첫번째에 무조건 명령줄이 오게 된다.) 문자열의 끝 까지 ebp-256 주소에 복사하고, printf로 복사한 문자열을 출력하고, 프로그램을 종료하게 된다.

RET을 현재 스택 안에 있는 쉘코드의 주소로 조작하는데, 이 주소값은 항상 변하기 때문에 공격이 성공할 수도, 실패할 수 도 있다.
조금 더 높은 공격 효율을 위해 nop slide 를 사용한다.

[!] nop slide란?
CPU 명령 중 "nop"라는 명령 (아무 동작도 수행하지 않음)



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함