! C++ / GCCCode int add(int src, int dest) { return src + dest; } int main(int argc, char* argv) { int i_test = 13; char c_test = 'c'; char str_test[] = "string"; // 간단한 변수 선언 i_test = add(1, i_test); // 함수 호출 } Asm .text:08048448 public main .text:08048448 main proc near ; DATA XREF: _start+17o .text:08048448 .text:08048448 var_2C = dword ptr -2Ch .text:08048448 var_19 = byte ptr -19h .text:080..
C언어(C++) 에서의 기본 자료형우리가 어떠한 언어를 이용해 프로그래밍을 하던, 다양한 정보를 저장하기 위해 다양한 변수를 이용해야 한다.변수들은 오로지 메모리 주소에 값을 저장하는데 이용되며, 이것은 당신이 변수를 만들었을 때, 메모리에 특정한 공간을 할당받음을 의미한다. 당신은 다양한 데이터 타입의 정보를 변수에 저장하기를 원할 것이다. (ex> 문자(chr), wide character(uncode, etc?), 정수, 소수점 숫자, 확장된 소숫점 숫자, 참과 거짓 등.)변수의 자료형이 기인하여, 운영 체제는 메모리를 할당하고 할당된 메모리에 어떠한 자료가 들어갈 수 있을지를 결정한다. 기본적으로 내장된 자료형C++은 프로그래머에게 다양한 내장된 자료형과 사용자가 직접 선언할 수 있는 자료형을 제..
1. 입력한 데이터를 연산해 한글자씩 비교해, 맞으면 Correct 를 출력하는 프로그램이다. 2.0804A020 주소에 scanf로 문자열 입력을 받는다.08048451 에서 한 글자씩 xor 연산을 하거나, 바로 비교해서 계산 값이 맞는지 비교하고 있다.0804848E 의 xor 연산의 경우에는 0FFFFFF88h -> 0x88 과 동일하다. (movzx -> 0x000000DD)http://www.asmcommunity.net/forums/topic/?id=4885 3. 굳이 계산할 필요 없이 Pseudocode를 봐도 된다. 답 : L1NUX
1. 특정한 키를 주면 그에 맞추어 file 이름의 파일을 해독하는 프로그램이다.키를 알아낼 필요 없이, 암호화된 파일만 복호화하면 된다.UPX로 패킹되어 있으니, 패킹을 풀고 분석한다. 2.004135E0 main 문에서 스택에 공간을 할당하고, 비휘발 레지스터 ebx, esi, edi를 스택에 저장한 후에 , "push, pop, pusha, popa" 명령어들이 계속 이어져 있는 것을 볼 수 있다. 순서대로 실행하면, 프로그램에 전혀 영향을 미치지 않는 쓰레기 코드들이다.0044A7AB 까지 이 코드들이 계속 이어져 있는데, 중간중간에 제대로 실행되어야할 코드들이 섞여 있다, 00425BB2 : 0044A990 함수를 프로시저로 스레드를 생성하고, (패치할 때 00425BC1 를 nop로 -> 이후..
1.폼에 그림을 그릴 수 있게 되어있고, "Check" 버튼을 누르면 "Wrong!" 이 출력된다.MessageBox 가 뜨는 시점에 프로그램을 suspend 시켜 caller address 를 찾아낸다. 2. MessageBox 를 호출한 부분에서 위로 올라가 보면 루프문을 돌면서 특정 데이터를 90000번동안 체크하는 구문을 볼 수 있다.더 위로 올라가 보면, 체크하는 데이터의 포인터가 담긴 ECX와 ECX+EAX 에 대략 직접 그린 그림과, 프로그램 내의 리소소를 가지고 있는 거라고 추측해 볼 수 있다.사진과 그린 그림이 일치하는지 90000번 확인해, 다르지 않다면 00401500 함수를 실행하고, 루린을 종료한다.바로 루틴을 실행해 보았으나 아무 일도 일어나지 않았고, exe 안에 들어있는 사진..
** 분석 중 문제 함수가 지역 변수 접근에 EBP 를 사용하지 않았음. (ESP 를 대신 사용함.)Immunity Debugger 에서 LOCAL.n Prefix 를 사용하지 못함. IDA 를 이용해 스택 주소를 확인함. 1.mp3 파일을 열어서 재생한다.1분 이상으로 듣지 못하고, 모든 체크 루틴을 우회하면 플래그를 볼 수 있다고 하였음.VB6으로 제작되었으며, 분석을 용이하게 하기 위해서 ida pro visua basic 6.0 스크립트를 통해 IDA 가 CallBack 등 함수를 제대로 나타날 수 있게 해준다.(VB6 Decompiler 를 통해서 빠른 분석도 가능하다.) 2.1분 이상 듣게 되면, "1분 미리ㅣ듣기만 가능합니다." 라는 메세지가 출력된다.이때 프로그램을 Suspend 해서, M..
** 분석 중 문제 함수가 지역 변수 접근에 EBP 를 사용하지 않았음. (ESP 를 대신 사용함.) Immunity Debugger 에서 LOCAL.n Prefix 를 사용하지 못함. IDA 를 이용해 스택 주소를 확인함. 1. 이름을 입력하면, 그에 맞는 시리얼 넘버를 계산한 뒤 입력한 시리얼 넘버와 일치하는지 확인하는 프로그램이다. 주어진 시리얼 넘버를 가지고, 이에 맞는 이름을 찾아내면 되므로, 시리얼 넘버를 생성하는 코드를 분석해 거꾸로 뒤집으면 된다. 2. 00401077 ~ 004010B4 while Loop 00401077 : Counter_1 이 3 이상이라면 0으로 초기화함. 밑에서 ESP - 130h, -129h, -128h 주소로 차례대로 엑세스한다. (00401038 에서 값 대입..
1. 프로그램 실행 시 문자열을 입력할 수 있는 창이 뜸.아무거나 입력하고 "Check" 를 누르면, 프로그램이 터진다.디버깅해서 오류가 난 Insturction 의 주소를 확인한다. 2.0040466F 에서 오류가 발생하였다. (eax 주소에 접근할 수 없음.)해당 주소의 근처에 jnz 와 같은 분기문으로 접근하는 코드가 없으니,jmp far ptr 을 이용한 점프문이나 call 로 실행되었을 것으로 볼 수 있다. 본 구문은 call 으로 실행되었음 알 수 있으며, 현재 스택 포인터에서 call ret address 를 찾을 수 있다.코드를 실행한 주소는 004046A9 3.해당 코드 근처에 bp 를 걸고 다시 실행한다. 조금 위로 올라가보면, eax 에 다이얼로그 텍스트 박스에 있는 문자열을 받아 u..
** 제대로 된 풀이방법이 아님. 나중에 다시 업데이트 할 예정. 메뉴얼 패킹되어 있는 프로그램이며, OEP 를 찾는 문제임. (Object Entry Point)흔히 이러한 메뉴얼 패킹이 되어 있는 프로그램의 경우, 복호화 루틴에서 마지막 부분에 JMP Instruction 으로 프로그램의 OEP로 프로그램의흐름이 이동하도록 되어있는 경우가 많다. 필자의 경우에는, 복호화 루틴이 끝나고 0x0040A1FB 에서 jmp loc_401150 Instruction 이 실행된 이후, 복호화 작업이 끝난 이후 변경된 Instruction 들을 볼 수 있는데,일반적인 함수 프롤로그 코드들을 이용해, 프로그램의 OEP 임을 추측해 볼 수 있었다. 다만, 해당 코드가 실행되지는 못하고 "Insturction coul..
** 분석 중 문제 함수가 지역 변수 접근에 EBP 를 사용하지 않았음. (ESP 를 대신 사용함.)Immunity Debugger 에서 LOCAL.n Prefix 를 사용하지 못함. IDA 를 이용해 스택 주소를 확인함.- ESP >> sub_401080 Call 명령어 실행 후 ret addr의 위치를 기준으로 함. 1. 프로그램 실행 시 문자열을 입력할 수 있는 창이 뜸.아무거나 입력하고 "확인"을 누르면, "Incorrect Password" 오류 메세지박스를 출력함. 2. 메세지박스가 뜨는 코드의 주소를 확인한다.IDA > String Windows 에서 해당 문자열을 확인.Xref 을 통해 문자열을 참조하는 코드를 찾는다. {0x0040113C}# WinMain 에서 DialogProc 콜백 ..