** 분석 중 문제 함수가 지역 변수 접근에 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 콜백 ..
세그먼트 레지스터 ! Windows / Linux 에서 각각 사용 용도가 다른 것 같음. 나중에 다시 자세히 정리.! 세그먼트 레지스터는 과거 286 ~ 80386 시스템에서 사용되었으며, 현재는 거의 사용되지 않음.! In Real mode(??) -> Boundary(기준값) + Offset(세그먼트 레지스터 - 메모리 주소 시작과의 차이)로 액세스함. 세그먼트란?세그먼트란, 프로그램에 정의된 특정 영역으로, 코드, 데이터, 그리고 스택으로 알려져 있는 것을 포함한다.한 세그먼트는 패러그래프 경계(paragraph boundary), 즉 16(hex 기준)으로 나누어지는 위치에서 시작한다.세그먼트는 메모리의 거의 어느 곳이나 위치할 수 있고, 실제 모드에서 최대64kb(in x86)의 크기를 가질 수..
함수 호출 규약 _ 기본적인 함수 호출 + 간단한 스택 사용어셈블리에서의 기본적인 함수 호출 규약 예제 Caller Function int main(int argc, char* argv[]) { sum(1, 2); return 0; } .text:080483F8 public main .text:080483F8 main proc near .text:080483F8 .text:080483F8 argc = dword ptr 8 .text:080483F8 argv = dword ptr 0Ch .text:080483F8 envp = dword ptr 10h .text:080483F8 .text:080483F8 000 push ebp .text:080483F9 004 mov ebp, esp .text:080483F..
** 번역한 내용이 대부분임. 문서 하단에 출처 참조함. 명령어 - 데이터 이동 / 산술 및 논리 연산기계어는 주로 3가지 목표를 가진다. 1. 데이터 이동 / 2. 알고리즘, 로직 / 3. 프로그램 흐름 제어여기에서는, x86 시스템에서의 중요한 명령어를 예시를 들어 설명합니다.단, 여기서 나타내는 예제들은 완전한 x86 명령어들은 아니지만, 보편적으로 유용한 부분을 가지고 있습니다. 완벽한 예제들을 보려면, Intel에서 제공하는 명령어 예제들을 참고하면 됩니다. # 기호 표시 Any 32-bit register (EAX, EBX, ECX, EDX, ESI, EDI, ESP, or EBP)Any 16-bit register (AX, BX, CX, or DX)Any 8-bit register (AH, ..
1. 바이트 순서 _ Little Endian 과 Big Endian 엔디안이란? (일부 출처)컴퓨터의 메모리와 같은 1차워느이 공간에 여러 개의 연속된 대상을 배열하는 방법. 이 때,바이트를 배열하는 방법을 바이트 순서(Byte order)라 한다. 빅 엔디안은 최상위 바이트(MSB - Most Signficant Byte) 부터 차례로 저장하며,리틀 엔디안은 최 하위 바이트(LSB - Last Significant Byte) 부터 차례로 저장한다. 예를 들어, 메모리에 데이터를 저장한다고 가정해 보자. Double Word (4바이트) 형식의 데이터 0x 12 34 56 78을 메모리 주소 0x 00 00 01 00 에 넣는다.이 때, Big endian 과 Little endian의 데이터를 넣는 ..
메모리, 주소 접근 모드 1. 전역, 정적 변수 선언우리는 x86 어셈블리에서 전역 변수와 비슷한 static 변수 지역을 특별한 어셈블러 명령을 이용해서 선언할 수 있으며,이는 반드시 .DATA 세그먼트에 선언되어야 한다. (세그먼트와 관련된 내용은 추후 추가 예정) 생성할 수 있는 메모리의 크기로는 1, 2, 4bytes 이다.* signed / unsigned : 최상위 비트를 부호 연산으로 사용하는지의 유무DB - Byte : 1바이트 > -127 ~ 127(signed), 0~254(unsigned), ASCII CharacterDW - Word : 2바이트 > -32767 ~ 32767(signed), 0~65534(unsigned)DD - Double Word : 4바이트 > word*wor..
1. 어셈블리 언어의 정의 (출처 : 위키백과)어셈블리 언어란, 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.컴퓨터 구조에 따라 사용하는 기계어가 달라지게 되며(ARM, MIPS), 이에 따라 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 어셈블러는 니모닉 기호(mnemonics -> ex> ADD eax, 1 에서의 ADD와 같은, 사람이 보기 쉽게 만든 언어를 말한다.)를 opcode(Operation Code -> 기계어의 일부로, 수행할 명령어를 나타내는 부호를 말함.) 로 변환하고, 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써, 목적 코드(실행될 수 있는 기계어 코드) 를 만들어낸다. 2. 레지스터 (범용)x86 기반 CPU는 8개의 범용 레지스터..
어쩌다가 발견한 거라 남겨 둠. 다음은 http://reversing.kr 에서 출제한 Easy_CrackMe 파일의 어셈블리 코드 중 일부이다. 1. Ollydbg 2. IDA 먼저 올리디버거 에서는 일반적으로 표시하듯이 ESP + n 형태로 메모리 주소를 가리키고 있는데, IDA 에서는 ESP + 현재 스택 포인터 + var_? 형태로 표시하고 있다. 언뜻 보기에 왜 저렇게 표시했을까 싶은데, IDA 에서 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하게 만든 것이다.IDA의 디스어셈블러 화면 시작 부분을 보면 이렇게 var_? 형태로 특정 값이 설정되어 있는데, 이는 함수 시작 시EBP 의 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값이다. String, var_63, var_..
IDA 6.8 버전 기준. 들어가기 전에...IDA란? Interactive DisAssembler 의 약자로, 강력한 바이너리 정적 분석 기능을 가진 툴이라 할 수 있다.특히 같이 설치되는 Hexray Decompiler 는 왠만한 ASM 코드를 가상 C언어 Pseudocode로 변환하고, 이를 기반으로 디버깅 할 수 있는 점이 큰 장점으로 꼽히고 있으며, C++, Python을 기반으로 하는 다양한 플러그인을 제작해 사용할 수 있다.이 외에도 찾아보면 다양한 장점이 존재한다. - 셋팅 1. 플러그인 설치먼저, 초기 설치 시 같이 설치되는 IDAPython을 설치하지 않았다면, 과감하게 전체 삭제 후 다시 설치하자.물론 수동으로 나중에 따로 설치해도 되겠지만 이거 은근히 귀찮고 잘 안된다. 플러그인은 ..
IPTIME 쉘 접근 및 telnet 접속 코드 / 프로그램 (버전 9.72) 코드 : https://github.com/zrkrbit/iptime (iptime-debug.py) 분석편 : http://jochiwon.tistory.com/5 python2 기반에서 만든 걸 python3버전으로 변경하고, 일부 오류수정 및 관리자 비밀번호 설정 시에도 사용 가능하도록 하였음. 내장되어 있는 텔넷 기능이 열리지 않으면 분석편 글을 참조할 것. 사용법 : 1. 공유기 관리 페이지 메인 화면에서 펌웨어 버전을 확인한다. 2. 시스템 관리 -> 기타 설정 -> 원격 지원을 "사용"으로 설정 후 저장한다. 3. 시스템 관리 -> 관리자 설정 -> 로그인 인증 방법 설정을 "기본방식"으로 설정 후 저장한다. 4...