리버싱 6

[리버싱] prob3, prob4, prob5

-참고-: (리버싱 2차시 포스팅 내용 중) 함수가 인자를 받을 때, 어떤 레지스터를 사용하는지는 아래의 표와 어셈블리어 코드를 보고 유추해야 한다. prob3 prob3 정적분석: time과 srand와 rand가 있는 것을 보아서 난수를 생성하는 코드라는 걸 알 수 있다. 같은 값이 나오는 취약점을 막기 위해서 시드를 변경하고 있다. 부터는 반복문이다. 10번 반복하는 반복문이다. scanf로 사용자로부터 입력을 받고 있는데, edi를 확인해보면 그 자료형을 확인할 수 있다. 따라서 edi에 0x400944에 있는 값을 넣었으므로, x/s 0x400944로 어떤 자료형으로 입력받는지 확인할 수 있다. x/s 0x400944의 결과값이 %d이므로, int형으로 입력받는다는 것을 알 수 있다. 그 다음에..

[리버싱] 3차시 과제2

main 0: rpb를 push한다. main 1: rbp에 rsp를 저장한다. main 4 : rsp의 값과 0x20를 뺀 후에 그 값을 rsp에 저장한다. main 8: mov rax에 fs:0x28부터 QWORD만큼까지에 해당하는 값을 저장한다. 스택 카나리 기법이다. main : rbp-0x8에서부터 QWORD만큼까지에 rax값을 저장한다. main : eax와 eax를 xor연산한다. 따라서 0이다. main : edi에 0xfeedc0de값을 저장한다. (0xfeedc0de로 최기화) main : 0x400580에 있는 함수를 호출한다. main : rbp-0x10에서 DWORD까지에 0x0 저장한다. main : 0x4007ca에 위치한 함수로 점프한다. main : edi에 0x4008d4..

[리버싱] 3차시

main +0: 스택에 rbp를 스택에 넣는다. rbp는 함수의 경계를 구분할 때, 함수와 함수의 맨 아래 경계를 가리킨다. main +1: 옮긴 rbp에 rsp를 대입한다. rsp도 함수의 경계를 구분할 때 사용되는데, rbp가 맨 아래 경계를 가리킨다면, rsp는 맨 위 경계를 가리킨다. main +4: rsp의 값에서 0x10만큼 뺀 값을 rsp에 저장한다. 0x10는 10진수로 10이다. main +8: 0x28은 10진수로 40이다. main +17: rbp에서 0x8(10진수로: 8)만큼 뺀 주소에 rax의 값을 QWORD(8byte)만큼 복사한다는 뜻이다. ptr은 포인터의 약자이다. main: 21: eax와 eax를 xor한 값을 eax에 저장한다. 0이 저장된다. eax는 산술연산과 함..

[리버싱] 2차시 과제 (2)

start : 실행 후 자동 중단 r : 실행 ctrl + c : 실행 중단 c : 계속하기 vmmap : 메모리 상황 보기 elfheader : 메모리 헤더들의 주소값 확인 disassemble 함수명 : 함수 디스어셈블 목록 확인 => ex) disassemble main u or nerarpc or pdisassemble : disassemble 명령어의 결과값을 정리된 형태로 출력 b *주소값 : break point 걸기 => ex) b *main+124 del 번호 : break point 삭제하기 => ex) del 1 ni : 한 줄씩 코드 실행 (call 함수 내부 건너뜀) si : call 함수 내부까지 한 줄씩 실행 finish : 진행 중인 함수를 종료 set 주소값 = 값 : 해당..

[리버싱] 2차시 과제

프로그램이 실행되는 동안에 디버거로는 기계어만 볼 수 있다. 하지만 어셈과 기계어는 1대1 대응되므로어셈을 볼 수 있다는 뜻이 된다. 그렇다면 어셈을 읽을 수 있다면,디버거의 동작과 흐름을 이해할 수 있다. x64란 ISA의 종류에서 다룬다. 명령어 처리 구조라는 의미로 cpu마다 아키텍처가 다르고 따라서 명령어가 다르다. 그중에서 x64 고유의 명령어 구조를 배웠다. x64를 공부하는 이유는 현재 cpu 점유율의 대부분은 x64와 x86(64bit 32bit) 이기 때문이다. 참고로 x64는 x86을 완벽히 지원한다.(역은 불가, 이것을 상위호환이라 한다.) 그리고 x64, x86-64, AMD64, Intel 64 ... 다 똑같은 x64를 말한다. 그 이유는 예전에 기업간의 교류 때문에 이름이 여러..

[리버싱] 1차시 과제

리버싱이란 무엇일까? 프로그램이 어떻게 동작하는지 이해하고, 이를 통해 취약점을 알아내는 것이다. 프로그램을 이해하려면 프로그램이 어떻게 동작하는지를 분석해야 한다. 프로그램을 분석하는 방법에는 프로그램을 실행하느냐 하지 않느냐로 구분되고, 정적 분석과 동적 분석이 있다. 정적 분석이란 프로그램을 실행하지 않고 파일 종류, 헤더 정보를 참고하거나 디스어셈블러, 디컴파일러 등을 이용해서 코드를 분석하는 것이다. 동적 분석이란 프로그램을 실행하여 분석하는 방법으로, 디버깅을 해서 코드 흐름과 메모리 상태를 분석하는 방법이다. (디스어셈블러: 기계어(2진수)를 어셈블리어로 변환해주는 툴. 디컴파일러: 기계어(진수)를 고급언어로 변환해주는 툴. 디버깅: 프로그램을 실행시키면서 분석하는 과정, 프로그램의 정확성이..