목록리버싱 기초 (76)
Self-Improvement
https://wogh8732.tistory.com/106 https://liveyourit.tistory.com/122 https://shayete.tistory.com/entry/4-Return-to-Library-RTL RTL은 DEP라는 방어의 우회 공격 기법이다. DEP란 버퍼 오버플로우로 RET(스택 등)에 실행 권한을 없앰으로 쉘코드 주입이 이루어지더라도 실행이 되지 않게 하는 방어 기법이다. 윈도우에서 DEP, 리눅스에선 NX-Bit라고 불리운다. RTL을 알기 전 필수?로 알아야하는 PLT, GOT을 간단히 알아본다. PTL은 외부 라이브러리의 함수들을 나열한 테이블이라 할 수 있다. GOT는 PTL에 나열된 함수들의 주소가 담겨져 있는 테이블이라 할 수 있다. RTL 공격 페이로드는 이..
소스코드 출처 : https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/ Heap OverFlow 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include #include int main(void) { FILE* fd = fopen("secret","r"); char* input = malloc(40); char* secret = malloc(40); fread(secret, 1, 40, fd); fclose(fd); read(0, input, 100); // Overflow! printf("%s\n", input); } Colored by Color Scripter cs 소스코드는 간단히 설명하자면 input, secret을 malloc로..
https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/ https://linarena.github.io/linux_0x06 https://y0ubat.tistory.com/222 스택과 달리 낮은 주소에서 높은 주소로 할당되어진다. 동적메모리 할당할 시 malloc()사용되며 반환값은 eax로 반환된다. eax가 가르키고 있는 주소는 힙영역에서의 데이터 부분이며 -8 주소 값을 할시에 prev_size, size 데이터 값도 확인할 수 있다. ex) x/10x $eax-8 buf1 변수를 malloc()하게되면 힙메모리에는 |prev_size size data|로 나타난다. 이 묶음을 chunk라고 불른다. A라는 Chunk의 구조를 보도록 한다. 1. prev_..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include int num2 = 3; void func2() { printf("func2()\n"); } void sum(int a, int b) { printf("sum : %d\n", a + b); func2(); printf("%d\n", num2); } int main(int argc, char*argv[]) { int num = 0; char arr[10]; sum(1, 2); printf("END\n"); printf("%d\n", num); printf("%d\n", num2); } Colored by Color Scripter cs main() -> su..
출처 : https://d4m0n.tistory.com/14 위 strcpy 실습을 보면 쉘코드를 입력받는 argv[1]에 넣어주며 buffer 주소를 ret에 넣는 이유는 ret는 4바이트임으로 buffer주소를 넣어줌으로써 쉘코드가 포함된 argv[1]을 buffer에 복사해줌으로써 ret가 실행될때 buffer주소에 접근하여 쉘코드를 실행하게끔 해주는 것이다. 출처 : https://bpsecblog.wordpress.com/2016/03/08/gdb_memory_1/ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include void func2(){ puts("func2()"); } void sum(int ..
메모리 맵 탭으로 들어가본다. 중요한 것들만 작성해본다. [PE Header] consoleapplication2.exe 정보라고 적혀있는 라인은 PE 헤더 정보를 뜻한다. 0xE30000이 시작 주소이며 0x1000 크기를 가지고있다. [Code Segment] ".text" 정보라고 적혀있는 세그먼트는 텍스트 세그먼트 또는 코드 세그먼트라고 불린다. 실행 코드가 들어있는 부분이다. [Data Segment] ".data" 정보라고 적혀있는 세그먼트는 초기화된 데이터가 저장되는 공간이다. 전역변수나 Static변수가 선언되어 있으며 초기값이 설정된 데이터가 저장되어있다. [Resource Data Segment] ".rdata" 정보라고 적혀있는 세그먼트는 문자열과 상수 등이 저장된 공간이다. 읽기 전..
IAT는 프로그램에서 사용하는 라이브러리 테이블이다 CFF Explorer에서 IAT에서 "kernel32.dll"에 속한 API를 확인하고 x32dbg에서 찾아본다. CFF Explorer의 IAT의 Kernel32.dll의 GetVersion API의 INT(Import Name Table) 주소 즉 문자열을 로딩한 주소는 0x75B6이며 Image Base 값 까지 합하면 0x4075b6 주소이며 x32dbg에서 확인해본다. GetVersion() 함수를 사용하는 부분을 알아본다. "Kernel32.dll" API 리스트에서 GetVersion은 2번째에 존재하며 이는 IAT의 위치를 나타내는 FTs에서 2번째 데이터이다. Kernel32.dll의 Fts 값이 0x7000이며 Image Base까지..
VA Vitual Address로 메모리의 절대 주소를 의미한다. 즉 x96dbg로 프로그램을 올렸을시에 로딩된 메모리 주소를 뜻한다. VA = RVA - Imagebase Easy_Keygen.exe 프로그램을 x64dbg에 올린 후 "Input Name:" 문자열이 로딩된 주소는 0x00408060이며 이것이 VA(Vitual Address)이다. RVA Relative Virtual Address로 프로세스 가상 메모리의 상대주소를 의미한다. RVA = VA - Image Base RVA = RAW + VA - PointToRawData 위의 VA가 0x00408060일 시 RVA 는 0x8060이 된다. RAW RAW는 디스크 상의 파일에서의 주소라 하며 우리가 잘 알고 있는 오프셋이라고 부른다...
http://reversing.kr/challenge.php 에서 Easy_CrackMe.exe를 다운받아 준다. 해당 프로그램을 실행하면 입력할 수 있는 메시지 박스와 입력 값이 패스워드와 같지 않다면 "Incorrect Password" 메시지 창이 뜨게 된다. 이 점으로 볼때 패스워드를 찾아야 한다는 것을 알 수 있다. 프로그램을 x32dbg로 열어준다. EIP는 00401188주소에서 시작하며 친절하게 EntryPoint라고 되어있다. 2가지 접근법이 존재한다. 1. 프로그램을 실행했을 때 메시지 박스가 뜬것을 감안하여 F8로 하나씩 실행하면서 메시지 박스를 호출하는 곳을 찾아내고 패스워드를 비교하는 곳도 찾아내어 분석한다. 2. 패스워드가 올바르지 않다고 메시지가 뜬 문자열을 찾은 후 해당 문자..
CASE 구문에서 배운 소스코드의 Main 함수에서 입력값에 따라 [one], [two]...로 문자열을 출력하게 된다. "[one]" 문자열 대신 다른 걸로 출력하게 문자열을 패치해본다. "[one]" 문자열이 저장된 메모리의 7E7B6C 주소로 이동하여 [바이너리패치 - 패치]로 문자열을 변경해준다. 만약의 상황을 위해 패치할때 크기 유지를 체크한 뒤 해준다. "[one]"을 "noONE"으로 패치한 후 확인해보면 정상적으로 변경되어 있다. 만약 기존의 글자보다 길에 써야할 경우에는 이 프로그램이 침범하지 않을 사용하지 않을 공간에 작성한 뒤 명령어를 패치해준다. 위 007E9444 주소를 기존 "[two]" 문자열 주소를 불러오는 어셈블 명령어를 007E9444주소로 변경한다. Space를 누르거나..