INTERLUDE ✦/2022 SYSTEM STUDY

[ DreamHack ] 동적 분석 연습 1

L_Chae 2022. 9. 29. 18:13

참여한 구글미트 링크 : https://meet.google.com/rcr-hrgg-ffm

 

동적분석 하기 전에 !! pwndbg랑 pwntools 공부를 제대로 안 하고 넘어가서

해당 부분 다시 실습해보고 동적 분석 연습해야 될것 같음!!

 

pwndbg 실습 : https://cherish-days02.tistory.com/23

pwntools 실습 :


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


void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

먼저 .c파일 부터 확인해보면 scanf로 141길이 만큼의 문자열을 입력받는것을 알 수 있다.

buf의 크기인 0x80(DEC : 128) 이상의 데이터를 입력하면 오버플로우를 발생시킬 수 있을것 같아보인다.

 

리눅스로 컴파일해서 디버거를 통해 ELF 동적 분석을 해보자!

 

 

[ gcc 컴파일 명령어 ]

gcc [파일명] -o [컴파일 후 만들어질 파일명]

 

 

gdb (디버깅 할 파일명)

 

readelf로 진입점을 확인해 본 결과 basic_ex의 진입점은 0x10b0임을 알 수 있음

 

디버깅이 완료된 화면!

 

disassemble명령을 사용하여 main을 디스어셈블 형태로 보면

 

call하는 부분이 순서대로

main함수 안의 initialize(), printf(), scanf()하는 부분인것 같다.

꺽새부분은 이뮤니티 디버거에서 봤던 각주 느낌으로 생각하면 될듯..!

 

<main+4> 부분에서 sub rsp,0x90하는걸로 봐서

해당 부분에서 rsp에 144만큼의 공간을 만드는 걸로 추측했다

 

<main+34> 부분부터는 rsi에 [rbp-0x80]한 주소값을

rdi에 [rip+-0xdc6]한 주소값을 넣는 모습을 확인 가능했다

(값 이동하는데 사용했던 eax는 다시 0으로 초기화 하는 모습을 확인가능)

 

그리고 <main+56>에서 call로 printf()를 수행하는 모습을 볼 수 있음

 

<main+61> 부분부터 다시 rsi에 [rbp-0x80]한 주소값을,

rdi에 [rip+-0xdb7]한 주소값을 넣는 모습 확인가능

(eax는 0으로 초기화함)

 

<main+83>에서 scanf()를 수행하는 모습을 볼 수 있음

 

<main+88>에서 mov eax, 0x0을 통해 return 0;을 수행하는 모습을 확인 가능

 


여기서부터는 다음날 실습한거라 주소값이 다르게 나옴.. !

 

 

break *주소값으로 원하는 위치에 브레이크 포인트를 걸 수 있고,

어느 부분에 브레이크가 걸렸는지는 info break을 통해 확인할 수 있다

run 명령으로는 브레이크 포인트를 건 곳까지 실행시킬 수 있음!