목록분류 전체보기 (173)
Iriton's log
계산기를 띄우는 쉘 코드 제작 과정 필요한 것 windows OS stdafx.h와 windows.h 헤더 파일 (해당 포스트 맨 아래에 첨부) stdafx.cpp 파일 (해당 포스트 맨 아래에 첨부) 디버거 Visual Studio 순서 1. C++로 calc.exe 실행 코드 작성 2. 어셈블리어 3. Hex 값 4. Null Byte 제거 1단계, C++로 calc.exe 실행 코드 작성 #include "stdafx.h" #include "windows.h" int main(int argc, char* argv[]) { char cmd[5] = { 'c','a','l','c','\x0' }; WinExec(cmd, SW_SHOW); ExitProcess(1); } cmd 변수에 실행하고 싶은 ex..
스택 오버플로우를 이용한 리턴 주소 변조(또는 덮어쓰기) 실습을 진행하려고 한다. * 해당 실습은 window, Immunity Debugger, Python, CodeBlocks를 이용하였다. 취약한 타겟 코드 해당 코드에서 Integer Overflow 취약점을 찾을 수 있다. len len은 문자열 길이를 저장하는 변수이다. char 타입으로, 7 bit(1 bit는 부호)만큼 사용한다. 따라서 최대 값은 128이다. (2의 7제곱수) 128이 넘으면 음수로 인식을 하기 때문에 조건문 else가 아닌 if문이 수행된다. 스택 구조 파악 및 시나리오 주요 스택 구조는 위와 같다. 정상적인 작동에서는 buffer 범위 내에서만 값이 저장되어야 하는데, 비정상적인 작동 즉, Overflow를 이용하면 b..
해당 웹 페이지는 http가 포함된 url의 데이터를 불러와서 출력한다. 소스코드를 살펴 보면 11번째 줄에서 http가 포함되었는지 확인을 한다. 포함되지 않았다면 문자를 띄우며 실행되지 않지만, 포함되었다면 shell_exec 함수를 이용하여 curl 명령어를 실행한다. escapeshellcmd()란? 임의의 명령을 실행하기 위해 쉘 명령을 속일 때 쓰이는 문자열의 모든 문자를 escape 시킨다. &#;`|*?~^()[]{}$\, \x0A 및 \xFF. 해당 문자 앞에 백슬래시를 넣어서 실행되지 않게 하는 것이다. curl란? URL 요청에 대한 응답을 출력하는 게 기본값. Option -o : 응답을 임의의 파일에 저장 등등 escape 함수에서는 하이픈(-)을 필터링하지 않을 뿐더러, curl..
name을 입력 후 제출하면 인사를 해준다. 여기에 어떤 명령어를 넣어야 할 거 같다. view-source로 소스코드를 살펴보자 대놓고 system 함수를 이용하여 ls를 실행하라고 한다. system 함수는 한 줄에 여러 명령어를 사용할 수 있다. 따라서 주어진 echo hello 뒤에 세미콜론으로 구분을 해 주고 ls를 넣으면 echo hello 명령 실행 후 ls 실행이 된다. 하지만 해당 코드에서는 싱글 쿼츠 안에 아까 name에서 입력 받은 값을 넣어준다. name에서 임의로 싱글 쿼츠를 닫아주면 그 이후로는 내가 마음대로 명령어를 사용할 수 있다. '; ls '를 입력하면 첫 번째 싱글쿼츠로 소스코드에 있는 싱글쿼츠를 닫을 수 있다. 세미콜론으로 구분 후 ls를 입력하면 되는데, 소스코드에 ..
Name이 CodeEngn일때 Serial을 구하시오. 풀이 올리디버거를 열어 무작정 한줄 실행을 하다보니 CALL 함수가 실행되고 아무것도 없던 화면에 문구가 떴다. Enter your Name 이라는 문구를 띄우는 코드 근처로 가서 분석해 보기로 했다. EAX와 EBP-3C와 비교하고 점프문이 실행된다. 비교문에 BP를 걸어두고 재실행하여 레지스터 값을 비교해 보았다. EAX엔 사용자 입력값이 저장됐다. EBP-3C 주소를 찾으면 된다. 70FEEC 주소로 가면 된다. 여기서 4바이트만 긁어서 변환해 주면 된다. 이때 리틀엔디언으로 표현되어 있기에 순서를 바꿔서 E4 C6 0D 97을 변환해야 하는 것에 유의해야 한다.
Name이 CodeEngn일때 Serial을 구하시오. 필요 개념 정리 Ollydbg 메뉴더블 클릭: 해당 주소로 이동 Az 아이콘: 현재 보고 있는 모듈에 있는 문자열들을 참조하는 어셈블리어를 검색해줌. CMP: 두 값을 비교한다. 두 값이 같다면 ZF가 1로, 다르면 0으로 설정됨. JNZ: JNZ A - 비교 값이 0이 아닌 경우 A로 이동, 0인 경우 점프하지 않고 다음 코드 실행. 비교된 값이 있어야 하므로 앞에 CMP가 먼저 실행되어야 함. EAX: 산술, 논리 연산을 수행. 함수의 반환값이 이 레지스터에 저장. 호출 함수의 성공 또는 실패 여부를 쉽게 파악할 수 있으며 반환값을 쉽게 얻어올 수 있음. 리틀 엔디언: 데이터 저장을 위해 메모리에 바이트를 저장하는데, 이 바이트를 저장하는 배열 ..
OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE EX) 00400000EB03 필요 개념 정리 ASPack 패킹: PUSHAD → 복호화 코드 실행 → POPAD → Return 0C → OEP 값 PUSH → Return으로 OEP 주소로 이동 ASPack 언패킹하는 법-하드웨어 BP를 이용하여 언패킹하는 법 -RET C를 찾아 OEP를 찾는 법 PUSHAD: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장 레지스터들의 값을 보관해야 할 때 사용 POPAD: PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용 RET(RETN): CALL을 통해 호출된 함수에서..
StolenByte를 구하시오 Ex) 75156A0068352040 필요 개념 정리 StolenByte: 패킹된 바이너리를 언패킹할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의 영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법.따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행되지 않는 것이다. OEP의 옵코드 몇 바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 StolenByte라고 하는 옵코드를 찾아서 실행코드 부분에 복원을 해준 다음 언팩 해주어야..