BOF 원정대 - Level2 gremlin 1. 소스 int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2) { printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 2. 어셈블리 코드 main+0xA 에서 argc인자값이 2이상인지를 체크해, 아닐 경우 "argv error\n" 를 출력하고 프로그램을 종료한다.main+0x23 부터는 ebp-0x10 (16 bytes) 떨어진 곳에 argv[1]의 값을 복사한 다음, 출력하고 프로그램을 종료한다. main 함수 스택에 256바이트의 저장 공간이 주어졌던 1번 문제와는 다르게, 이번 문제에서는..
BOF 원정대 - Level1 gate 1. C 코드 및 어셈블리 확인 int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } .text:08048430 public main .text:08048430 main proc near ; DATA XREF: _start+17o .text:08048430 .text:08048430 dest = byte ptr -100h .text:08048430 argc = dword ptr 8 .text:08048430 argv = dword ptr 0Ch .t..
! 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..
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..