반응형

리버싱 20

20일차 마무리.

1) 쓰레기 값을 많이 넣어서 배열의 크기를 알아본다use lib "/pentest/exploits/framework2/lib"; use Pex::Text;$pattern = Pex::Text::PatternCreate(10000); printf("%s", $pattern); //perl pattern.pl ----------------- root@bt:/pentest/exploits/framework2/sdk# ./patternOffset.pl 46366846 10000 41282) 알아낸 배열의 크기 만큼 채우고 리턴주소를 파악한다.#include "stdafx.h" #include #include int main(int argc, char* argv[]) { int state; //파일 개방 FIL..

리버싱 2013.05.05

18일차 리버싱, std

Win7 : ntdll.jmp esp : 7799BFE4 WinXP : ntdll.jmp esp : 7C971EED mov byte [edx+1F3], 0 500번쨰에 null 문자를 넣는다. 배열이기에 1F4를 1F3으로 해서 마지막에 0을 넣는다. mov byte [edx+1F3], 0 push EDX call 401000 jmp 4011F9------------ jmp 00404D8BESP (EBP-176c)에서 빼기 7DHOTPIX == 개발자가 오기전까지 확인memcpy라는 함수는 길이를 재기에 실제 길이 재는 함수 strlen을쓰는게 낫다. if(strlen(str) > 500 ){ buf[499]=\0 }  Function Calling Convention 함수 호출에 관한 규약(약속) ..

리버싱 2013.05.01

__cdecl, __pascal, __stdcall의 차이점

함수호출 방식이 __cdecl, __pascal, __stdcall로 여러 가지가 있는 이유는 윈도우즈의 역사성에 있다. 우선 win16에서는 실행파일의 크기가 줄어들고 속도가 빠르다는 이유로 pascall 방식을 사용 했고 win32에서는 가변매개인자를 지원하는 함수를 제외한 모든 함수들은 __stdcall을 사용 한다. 만약 c 방식의 함수호출을 원한다면 __cdecl을 명시해 주어야 한다.(윈도우즈 프로그래밍에 있어서) 우선 c 방식의 함수 호출과 pascal 방식의 함수호출의 차이점을 알아보자. 첫 번째로 함수호출후 종료 시점에 호출한 함수의 스택을 정리하는 주체가 호출한 함수이냐 아니면 호출당한 함수이냐의 차이이다. 두 번째는 매개인자를 스택에 넣는 방향에 따라 나눈다. 즉, 다음과 같이 정리할..

리버싱 2013.05.01

17일차, (백트랙)리턴 주소를 활용한 악성코드 생성.

## 주소값을 이용한 악성코드 로직지역변수 부분이 들어가는 부분의 크기를 확인 한 후 그 부분을 모두 채우고 난 뒤 리턴값이 들어가는 부분을 1. port scan - nmap 2. session -nc 3. Attack -perl\\\\\\\\\\\\\ 1.port Scan #nmap -sS -f XP의 IP -p 6000-7000 (총 65355여개)xp: 150 linux : 1002. Session NC=netcat # nc Xp의 IP 6235root@bt:~# nc 192.168.17.150 6235 Hello server : hi, Client Hello09_vuln_server가 문자열을 저장했다가 돌려준다.func(char *str){ char buf[4]; memcpy(buf,str,1..

리버싱 2013.05.01

16일차, 복귀주소를 활용한 악성코드 실습

clt + f8로 caller부분 breakpoint하고 찾아서 nop으로 바꿈 처음부터 분석하거나 뒤에서 ebp+4로 콜러를찾아감 ## 복귀 주소를 따라간다면 콜러를찾을수있다.!!! --------------------------- 지금은 콘솔창 void func(){ int *p; p=(int*)&p; p+=2; *p+=0x0D; } int main (int argc,char* argv[]) { printf("Buffer \n\n"); func(); printf("hackked \n"); printf("hked \n"); getch(); return 0; } //복귀주소를 0x0D로 옮긴다. 확인 win32 app // aa.cpp : Defines the entry point for the appl..

리버싱 2013.04.30

12일차 포인터의 caller,callee. 반복문

메인찾을필요없어짐search - name in current module - all inter modular call올리디버거 환경설정 option -> appearance -> Directories에 들어가면 UDD가 있다. 해당 위치에 디버그하던 comment, (soft)breakpoint 등의 로그가 남아있다. ## Search에서 소스 찾기. search에서 찾은 내용에서 breakpoint를 걸 수 있다. 그러므로 메인을 실제로 찾을 필요가 사라진다. SFP가 없는 최적화EXE에서도 분석이 가능해짐. 다음과 같이 All referenced text strings를 클릭하면, 현재 exe파일에서 나타나는 모든 문자열이 나타난다. E를 누르면 실행되는 모듈들이 나타난다. Name in curren..

리버싱 2013.04.23

11일차, caller, callee 복귀주소(RETN)

디버그모드는 EBX,ESI,EDI를 레지스터에 넣어서 사용한다.마음대로 변수로 쓰겠다.EBP+8 - 1ARGUMENT EBP+C- 2ARGUMENT EBP+4- RETURN ADDRESS ----------------------------- 이는 예전 운영체제(DOS)에서 사용하던 기법들로, 오늘날에는 예전 프로그램과의 호환성을 위해 존재한다. SS : stack segment DS : Data Segment CS : Code Segment ES : Extra Segment -- 위에 있는 영역만으로 모자랄 때 사용한다. FS : F's Segmnet GS : G's Segment 00401000 -- 코드영역의 시작 부분은 대부분 같은데, 95, 98은 주소를 하나로 두고 때어다 썼다. 주소만 가지고는..

리버싱 2013.04.22

10일차, 브레이크 포인트, Frame Pointer Omission

3-8 결과값을 바꿔라. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 3-8번문제 C언어로 확인 #include "stdafx.h" #include int main(int argc, char* argv[]) { int i; int sum=0; for(i=0; i < 1000 ; i++){ sum=sum+i; if(sum == 33670){ printf("33670일 때 i는 %d \n",i) ; } else if(sum == 178503){ printf("33670일 때 i는 %d \n",i) ; } } return 0; } F9번으로 breakpoint 잡고 f5으로 순서대로 진행 33670일 때 i는 259 33670일 때 i는 597 F7-함수안으로 들어간다. ## 브레이크 포인..

리버싱 2013.04.20
반응형