목록리버싱 (16)
안 쓰던 블로그
시작 전에 읽으면 좋은 이전 글: VA, RVA, RAW의 개념 foxtrotin.tistory.com/330 DLL(Dynamic Linked Library) 여러 프로세스에서 공유하면서 쓰는 동적 연결 라이브러리 예전 16비트 DOS시절에 DLL개념이 없고 Library만 존재했을 때는 함수 하나(예를 들어 printf)를 실행하고자 하면 라이브러리에서 binary코드를 그대로 가져와서 프로그램에 삽입시켜 버렸다. 즉, 실행 파일에 printf()함수의 바이너리 코드를 가지고 있는 식이었다 그런데 Windows OS로 넘어오면서 멀티태스킹 환경이 지원되었는데, 여러 프로그램들이 동시에 실행되어야 하는 상황에서 각 프로그램마다 기본 라이브러리들과 프로그램을 위한 라이브러리들을 포함시키려니 중복으로 인한..
EAT(Export Address Table)는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 핵심 메커니즘이다. ( 라이브러리가 가진 함수를 다른 프로그램에서 사용할 수 있도록 하는 것) IAT처럼 PE 파일 내의 특정 구조체인 IMAGE_EXPORT_DIRECTORY에 정보를 저장한다. 이 구조체는 PE 파일에 하나만 존재한다. 중요 멤버 NumberOfFunctions : 실제 Export 함수의 개수 NumberOfNames : Export 함수 중에서 이름을 가지는 함수 개수 (
RVA RVA: ImageBase로부터의 상대주소 (메모리에 로딩된 상태) 특정한 위치로부터 얼마만큼 떨어진 곳에 위치하는지 알려주는 주소 ImageBase는 NT Header중에서 IMAGE_OPTIONAL_HEADER32 구조체 안에 있으며, 메모리에서 PE파일이 어디에 로딩이 되는지 메모리에 로딩되는 시작 주소를 알려준다 PE헤더에서 나오는 거의 모든 주소값은 모두 RVA를 의미한다 VA VA: 프로세스 가상 메모리의 절대주소 (실제 메모리에 로딩되는 주소) 윈도우즈에서 파일을 실행하게 되면 프로세스 어딘가에 존재하는 가상의 메모리 주소공간에 실행한 파일이 올라간다 가상의 메모리이기 때문에 파일이 어디에 로딩 되었는지 시작 주소를 알고 있어야 파일에 접근할 수 있다 실제 주소와 가상 주소를 연결해 ..
굉장히 익숙한 main함수 자연스럽게 함수 들어간다 처음에 스택 공간 할당하고 CMP RAX, 18과 MOV EAX, 1이 한 세트니까 for문을 0x18번 돈다는 것을 알 수 있다 플래그가 총 0x18(24)글자라는 걸 생각하고 아래 for문을 본다 for문 안에서는 아래같은 연산을 한다 1) 문자열 받은 것과 연산 RAX에 현재 카운터 주소값의 값을 넣고 RCX에는 입력받은 문자열 시작점 주소를 넣는다 EAX에 [시작점+카운터값]주소의 값을 넣으니까 a[i]가 된다(문자열이 a라고 할 때) MOV ECX, DWORD PTR SS:[RSP]에서 RSP는 지금 돌고 있는 카운터 값이다 카운터 값을 ECX에 넣는다는 의미이다 INC는 증감 연산자이다 피연산자++ 동작을 한다 지금은 ECX를 ++하고 있다 ..
먼저 메인 함수를 본다. main을 보면 구조는 이전 문제들이랑 다르지 않다 함수에 들어가 본다 RCX(입력값)을 RSP+8 주소에 가져온다 RSP에 18만큼의 공간을 준비한다 RSP주소에는 0을 넣는다 JMP한다 CMP RAX, 1C를 하는데 RAC와 1C를 비교하는 것 결과값이 ~65주소보다 크거나 같으면(JAE) EAX에 1을 넣고 RSP에 18을 더하면서 종료된다 계속 비교하며 반복하는 모습이 보이니 즉 이 부분은 for문이다 for(int i=0; i>4 연산인 것이다 이 연산이 끝나면 RAX가 4가 된다 RDX에 다시 Hello를 가져온다(RSP+20 주소) ECX에 rdx+rcx*1: "Hello"를 한다 ECX에 'H'인 48이 들어간다 SHL은 왼쪽 쉬프트 연산. ECX가 원래 48이었는..
이 문제에서도 rev1처럼 입력을 받고 뭔가 함수 호출 후에 corret wrong에 따라 분기한다 분기문에서 bp걸고 f7로 내부로 들어갔다 문자열을 한 글자씩 가져온 후에 어떤 연산을 거치고 input과 비교한다 한 글자씩 비교하는 함수를 총 0x18(23)번 반복하기 때문에 Flag가 총 0x18(23)글자인것을 먼저 확인해야 한다 (마지막은 \00) 첫 번째 글자를 구할 때는 카운트가 0부터 시작되기 때문에 Flag 첫 글자와 연산에 사용되는 비교 문자의 글자가 동일하다. 일단 규칙을 찾아야 한다. 첫 번째 글자는 그랬는데 두번째 글자부터는 카운트가 1로 증가하며 뭔가 연산이 시작되는 것을 볼 수 있음 첫 번째로 본인이 입력한 글자 ^ 카운트 연산을 한다 두 번째로 첫 번째 연산 과정에서 구한 결..
프로그램 실행-input: 이라는 게 뜨고 입력하면 종료된다 문자열 검색-input이 있다 사실 여기서도 누가봐도 플래그 같이 생긴 문자열이 있긴 하다.. input으로 이동한다 처음에는 input: 을 출력한다 그리고 256바이트를 입력 받는다 CALL 0x00007FF7B2B41000 해서 해당 함수를 호출한다 호출해서 나온 결과값을 비교해서 0이면 corret 틀리면 wrong을 출력한다 일단 함수에 따라 들어가보면 아래처럼 있다 위에서 입력받은 값을 Compar3_the_str1ng과 strcmp함수로 비교한다 strcmp는 동일하면 0을 반환한다 JNE로 0이 아니면 1이고 0이면 0을 리턴한다 어쨌든 여기서도 플래그를 확인할 수 있다 Compar3_the_str1ng 여기서 0으르 리턴하면 위..