리버싱 3

리버싱 4차시 과제

prob1 main 함수가 보인다. main 함수를 확인해보았다. sub으로 스택을 확장하고 rbp-0x8에 fs:0x28을 넣는다. 이게 스택 카나리다. 마지막에 fs:0x28과 rbp-0x8을 비교하는 것을 볼 수 있다. main+28에 puts를 호출한다. edi에 0x4007d4가 들어간다. 0x4007d4가 문자열이라고 추측할 수 있다. __isoc99_scanf@plt는 scanf의 plt를 말한다. 이 plt가 libc의 scanf의 실제 주소를 가리키는 got를 가리킨다. edi는 아마 포맷 스트링이 될 것이고, rbp-0xc는 저장되는 위치를 말할 것이라고 예측할 수 있다. 그리고 cmp를 통해서 rbp-0xc부터 4바이트와 0xdeadbeef와 비교한다. 다르면 끝내고 아니면 flag ..

리버싱 3차시 과제

x86 VS x64 x86은 x86 계열 32비트 CPU(Intel, AMD)의 ISA이다. x86_32라고 부르는 것을 더 많이 본 것 같다. x64는 Intel이나 AMD 같은 x86 계열 64bit CPU들이 사용하는 ISA(Instruction Set Architecture)를 말한다. x64를 x86의 64비트 버전이라고 해서 x86_64라고도 많이 부른다. 기본적으로 x64는 x86을 지원한다. x64, x86 registers 레지스터는 되게 많다. 그런데 범용 레지스터(General Purpose Register)만 살펴보겠다. 그 이유는 사용자가 직접 사용할 수 있는 몇 안 되는 레지스터이기 때문이다. 실제로 디버깅할때도 거의 범용 레지스터만 본다. 가끔 eflags도 본다. cs, ss..

리버싱 2차시 과제

리버싱이란? 리버싱 : Reverse engineering의 약자로 역공학이라는 뜻이다. 바이너리의 구조, 기능, 동작을 분석한다. 크게 두 가지 방법이 존재한다. 정적 분석 : 파일을 실행하지 않고 파일 종류, 헤더, 디스어셈블러, 디컴파일러로 코드를 분석 동적 분석 : 파일을 실행하면서 코드 흐름과 메모리 상태 등을 보면서 분석 gcc 사용 코드를 작성하고 조금 옵션을 줘서 컴파일을 해보겠다. layer7.c는 원본 소스코드 파일이다. layer7.i는 전처리된 소스코드 파일이다. layer7.s는 어셈블리어 파일이다. layer7.o는 어셈블러에 의해 기계어로 변환된 파일이다. layer7은 layer7.o가 링커가 링킹을 하고나서 나온 최종적인 바이너리 파일이다. 빌드는 이 전처리기, 컴파일러, ..