참여한 구글미트 링크 : 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 [컴파일 후 만들어질 파일명]
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 명령으로는 브레이크 포인트를 건 곳까지 실행시킬 수 있음!
'INTERLUDE ✦ > 2022 SYSTEM STUDY' 카테고리의 다른 글
[ DreamHack ] Shell_basic 풀이 (0) | 2022.11.01 |
---|---|
[ DreamHack ] pwndbg 실습 (0) | 2022.10.04 |
pwndbg, pwntools 설치 (0) | 2022.10.04 |
[ DreamHack ] x86 Assembly (0) | 2022.09.25 |
[ DreanHack ] 시스템 스터디 (0) | 2022.09.22 |