본문 바로가기

CAT-Security

커널모드와 유저모드(사용자모드) 정리 유저 애플리케이션이 운영체제에 치명적인 데이터에 접근하여 수정하거나 삭제하지 못하게 막기 위해 윈도우는 두가지 프로세서 접근 모드를 지원 한다. 유저 어플리케이션은 유저모드에서만, 운영체제 코드(시스템 서비스와 디바이스 드라이버)는 커널 모드에서 실행이 된다. 커널 모드는 모든 시스템 메모리와 모든 CPU 인스트럭션에 접근이 허가된 프로세스 실행 모드를 말한다. (한마디로 admin) 즉 프로세서는 유저 모드보다 커널모드에 높은 권한을 줌으로써 오동작을 유발하는 유저 어플리케이션등이 시스템 전체에 안전성을 해치지 않게 보장하는 필수 기반을 운영체제 설계자에게 제공 한다. 각 프로세스들은 고유한 개별 메모리 공간을 가지지만 커널 모드 운영체제와 디바이스 드라이버 코드는 단일 가상주소 공간을 공유 한다. 가.. 더보기
[Python] BeautifulSoup 모음 한글이 깨졌을 경우 Url_html = urllib2.urlopen(Url).read().decode('cp949', 'ignore') 출처 : 클릭 더보기
[윈도우 후킹] Message hooking - 1 0x00 후킹의 개념 후킹은 소프트웨어 공학 용어로, 운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생 하는 함수 호출, 메세지, 이벤트 등을 중간에 바꾸거나 가로채는 명령, 방법, 기술이나 행위를 말한다. 이때 이러한 간섭된 함수 호출, 이벤트 또는 메세지 처리하는 코크를 후크라고 한다.크래킹을 할떄 크래킹 대상 컴퓨터의 메모리 정보, 키보드 입력 정보등을 뺴돌리기 위해서 사용 되기도 한다. 예를 들어 특정한 API를 하쿵 히가 되면 해당 API의 리턴값을 조작하는 등의 동작을 수행 할 수 있다.(위키백과 펌) 즉 다른 프로세스의 실행 경로를 가로 채는 것을 말 합니다.대표적인 예로 키로거,매크로, 원격 등이 있습니다. 종류는 구성 요소간에 발생 되는 모든것을 .. 더보기
[PlaidCTF 2013] three eyed fish_100 문제는 64bit elf 파일이며, stripted가 걸려 있는 파일 입니다. 실행시 아무런 반응이 없어서 strace로 실행을 시켜 보았습니다. ptrace(PTRACE_TRACEME, 0, 0, 0) 에서 에러가 남을 확인 할 수 있습니다.찾아보니까 주어진 프로세스에 대한 UDI가 현재 사용자의 UID와 매칭되지 않으면 다음과 같은 에러가 뜨는 것 입니다. 단순히 UID만을 검사 하는것이면은 프로그램에서 '없어도' 될것이라 판단이 되며 코드패치로 삭제시켜 보았습니다. objdump로 함수 주소를 찾아도되고, IDA64에서 찾아도 무방 합니다. 찾아서 이렇게 NOP코드로 변환 시켜주게 되면 저 함수는 실행되지 않고 그냥 지나치게 되어 버립니다. UID 검사 루틴을 제거해주니, 비정상적인 종료를 하지않고.. 더보기
[CSAW CTF 2012] Reversing_400 문제는 64bit, not stripped 파일 입니다 실행시 암호화된 Key값이 보입니다. 단순히 Key값만을 출력해줌을 알 수 있습니다. IDA64로 디버깅 했을시, 단순히 값들을 입력받고 encrypt 함수를 실행시켜서 암호화 한후 그 결과값을 출력 해 줍니다. 허나 이 문제의 경우 encrypt 함수가 있고 decrypt함수도 존재 합니다.즉 encrypt를 Call 하는 부분을 강제로 decrypt로 eip를 바꾸게 되면 키값이 decrypt가 될것이라 생각 했습니다. gdbserver로 리모트 디버깅을 시도해서 eip를 강제로 decrypt쪽으로 분기 시키니까 키값이 보이게 되었습니다. 다른 방법으로는 코드패치가 있었습니다.출처 : http://havu.tistory.com/28 Encrypt.. 더보기
[Codegate2014] dodoCrackme_200 프로그램은 다음과 같이 64-bit elf파일이며 stripped가 걸려 있습니다. 실행을 했을 떄 입력을 받으며 Permission denied을 출력하며 프로그램이 종료 됩니다.. strace로 확인 했을 때 write와 와 read가 보임을 확인 할 수 있습니다. IDA 64로 열어봤을 때, 이러한 루틴이 반복됨을 확인했고, 증가 된 값을 메모리 어딘가에 저장을 합니다.반복되었기 때문에 찍히는 문자열을 보았고, 키값이 나왔습니다. 허나 이 방식은 제대로 된 풀이 방법이 아니기 때문에, 타 블로그에 있는 정상적인 방법을 쓰겠습니다.출처 : http://pwnbit.kr/42 write의 경우 호출값은 1이며 read는 0 입니다.다음은 64bit 환경 리눅스에서 read 및 함수들이 어떻게 호출 되는.. 더보기
[Reversing.kr] Direct3D_FPS 프로그램을 실행 시키면 다음과 같은 3D_FPS 게임이 시작 되게 됩니다.저 달걀(?)을 몇방 쏘면 사라지며 게임내의 모든 달걀들을 없에더라도 클리어가 되질 않습니다. 또한 HP10은 달걀과 몸을 부딕쳤을 경우 피가 소모 됩니다.상단바 위의 ReversingKr / FPS는 값이 시시각각 변하긴 하는데 그닥 중요한 값이 아니라 생각이 들었습니다. Ollydbg의 막강한 기능중 하나인 Search for all referenced string를 이용하여 Game Clear 부분을 따라 가보았고그곳으로 억지로 강제로 분기를 조작하여 출력을 했더니 이상한 값을 출력 했습니다.이 이상한 값을 메모리 덤프에서 검색을 해 보았더니 00407028의 주소값에 있는 값을 출력함을 알 수 있었습니다. 스크린샷을 찍으면서.. 더보기
[Secuinside2013] beist_attack_game_150 프로그램을 실행 시키면 다음과 같은 게임 화면이 나오게 됩니다.점수 획득이 가능하며 1000점을 달성했을 시에 보스몹이 나오게 되고그 보스몹의 피는 999999 입니다. 보스몹은 전체공격(?)을 시전해서 정상적인 방법으로도저히 클리어가 불가능합니다. 보스몹 출현!! 보스몹의 피를 깍는건 거의 불가능 합니다. 현재 게임에서 볼수 있는 단서는 점수라고 생각하고그 점수값이 1000점이 되었을때 새로운 함수가 실행 된다라는 생각이 들어서점수를 중심적으로 찾아 보았습니다. 예상대로 1000점이었을경우 if문 안으로 분기해서 보스몹을 띄우는 루틴을 찾을 수 있습니다. 여러 루틴을 살피던 도중에 스코어 값이 20점이 되었을때 406450의 메모리의 값을바꿔버리는 루틴을 찾을 수 있었습니다. 바뀐 이후의 메모리 값 입.. 더보기
gdb 명령어 요약집 1. 우선 컴파일 시에 디버깅 정보를 담아야 한다. gcc -g -o [프로그램명] [소스파일명] 디버깅 옵션인 -g 으로 컴파일하며, 최적화 옵션인 -O 은 주지 않도록 한다. 2. 실행방법 gdb [프로그램명] gdb [프로그램명] [core파일명] gdb [프로그램명] [실행중인프로세스pid] 3. 종료방법 q Ctrl + d 4. 소스 찾아가기 (list) l : main 함수를 기점으로 소스의 내용이 출력된다 l 10 : 10 행 주변의 소스가 출력되는데 10 - 5 행부터 10 + 5행까지 총 10행이 출려된다. l func : func 함수의 소스를 출력 l -5 : 기본값으로 10줄이 출력된다고 가정하고, 다음에 출력될 라인이 11라인이라면, 10(마지막라인) - 5 라인을 중심으로 출력된.. 더보기
[Defcon 21 ctf] policebox 분석지점 int __cdecl main(){ signed int v1; // [sp+1Ch] [bp-4h]@5 if ( !isatty(ttyfd) ) perror("not on a tty"); if ( tcgetattr(ttyfd, &orig_termios) < 0 ) perror("can't get tty settings"); atexit(tty_exit); tty_raw(); v1 = 0; printf("The key is: "); while ( v1 더보기
Python 예외처리 프로그램 실행에 있어 에러가 발생할 경우, 이에 대한 적절한 처리를 위해서 Python에서도 try, exception 구문을 통해서 예외처리를 수행할 수 있도록 지원하고 있다. 대표적인 예외처리 구문으로 '파일 불러 오기' 구문이 있다. 예를 들어 아래와 같이 존재하지 않는 파일을 불러올 경우 'IOError'가 발생함을 볼 수 있다. >>> open('FileName', 'r') Traceback (most recent call last): File "", line 1, in IOError: [Errno 2] No such file or directory: 'FileName' 위와 같이 파일 불러오기 구문의 경우 실제 프로그램에서 에러가 자주 발생할 수 있는 부분으로 예외처리가 필수적이다. Pytho.. 더보기
리버싱의 기초 정리 지금부터 이루어지는 포스팅은 IA-32 Processor Architecture 기반입니다. 1.레지스터 - CPU 내부에 있는 8,16,32Bit 고속 저장소를 말하며 일반적으로 사용하고 있는 메모리 보다 데이터를 훨씬 빨리 Read ,Write 할 수 있음. ㆍ범용 레지스터 (General-Purpose Register) : 8개EAX, EBX, ECX, EDX, ESI, EDI레지스터는 우리 마음대로 쓸 수 있는 레지스터이다.EAX : Accumulator Register. 곱셈, 나눗셈 명령에 쓰임.EBX : Base Register.ECX : Counter Register. 루프 카운터로 쓰임.EDX : Data Register.ESI : Source Index. 고속의 메모리 복사에 쓰임.ED.. 더보기
MBR 덤프해서 16비트 어셈블리 코드로 보는방법 MBR 덤프해서 ASSEMBLY 코드로 보는방법 1. HxD 다운 / NASM 다운 HxDhttp://mh-nexus.de/en/downloads.php?product=HxD NASMhttp://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D 2. HxD로 MBR Binary 덤프HxD 설치 후 DISK 아이콘 선택디스크 중에서 물리 디스크 - MBR 분석할 물리 디스크를 선택 후 수락읽어보면 0000:0000부터 섹터 0만큼(512BYTE)가 MBR 영역이므로 해당 영역만 복사해서 새 파일로 만듬.새 파일 - 붙여넣기로 512바이트 영역 생성다른 이름으로 저장 - mbr.bin설치된 nasm 폴더내의 ndisasm.exe로 바이너리 이미지를 16비트 어셈블리로 변경ndis.. 더보기
MBR (Master Boot Record) 정리 MBR은 저장매체의 첫 번째 섹터(LBA 0)에 위치하는 512 바이트 크기의 영역이다. 다음 그림은 MBR의 기본적인 구조를 보여준다. 처음 446 바이트는 부트 코드(boot code) 영역, 64 바이트는 파티션 테이블(partition table), 마지막 2 바이트는 시그니처(signature)를 나타낸다. 운영체제가 부팅될 때 POST(Power On Self-Test) 과정을 마친 후 저장매체의 첫 번째 섹터를 호출되는데 이때 해당 부트 코드가 수행된다. 부트 코드의 주 역할은 파티션 테이블에서 부팅 가능한 파티션을 찾아 해당 파티션의 부트 섹터(boot sector)를 호출해주는 역할을 한다. 만약, 부팅 가능한 파티션이 없을 경우에는 미리 정의된 에러 메시지를 출력한다.다음 표는 MBR .. 더보기
ASProtect 2.1 MUP 정리 문서 파일 입니다.잘못 된 점은 리플로 남겨주시면 감사하겠습니다. 더보기
AsPack MUP 정리 패커와 프로텍터의 차이점 패커 패커란 실행 파일 압축기를 말 한다. 정확한 명칭은 Run_Time 패커라고 한다. ‘실행 압축’ 이란 실행 파일에 실행 코드를 원본 형태로 두지 않고 압축을 한 것 이다. 그리고 압축해제 코드를 실행 파일에 같이 넣어 놓은 것 이다. 그래서 프로그램이 실행 될 때 먼저 압축해제 코드를 만나 원본 실행 코드 압축이 풀린 뒤 실행이 된다. 이러한 실행 압축을 만드는 것을 패킹이라고 한다 패커의 사용 목적은 다음과 같다. 1. 실행 파일을 줄이고자 하는 목적 2. PE 파일 내부의 코드와 소스를 감추기 위한 목적 프로텍터 프로텍터란 PE 파일(실행파일)을 리버싱으로부터 보호 하기 위한 프로그램 이다. 패커 처럼 실행 압축 할 뿐만 아니라 리버싱을 막기 위한 기법들이 추가 된다... 더보기
[api]모달과 모달리스의 차이 윈도우의 Form(형식)과 dialog(대화상자)를 모달 혹은 모달리스로 표시할 수 있다. 모달 간단한 개념으로 모달 창이 열렸을 때는 기존에 있던 창을 사용하지 못하는 방식이다.즉 제어권을 독점하게 되어 그 창이 종료하기전까지는 기존창을 작업 할 수 없는 방식이다. 중요한 메세지를 표시하는 다이얼로그는 거의 모달로 나타낸다. visual studio의 정보 대화 상자나, api의 messagebox는 사용 할 수있는 모달 형식의 한 예이다. 모달리스 모달과는 반대의 개념으로 창이 열리더라도 기존에 있던 창을 작업 할 수 있다.모달리스는 사용자가 순서에 상관없이 접근이 가능 하기 떄문에 사용자의 동작에 관계 없이 응용 프로그램의 상태를 일관성 있게 유지해야한다. 즉 프로그래밍 하기 더 어렵다는 애기이다... 더보기
Callback(콜백 함수) 정리 정의 – 호출된 함수를 알려주어, 다른 프로그램 또는 다른 모듈에서 함수를 호출 하게 하는 방법 일반적으로 운영체제(OS)가 호출할 어플리케이션의 함수를 지정해 특정한 사건 또는 메시지가 발발 했을 때 호출되도록 지정 할 수 있다. 이런 함수를 콜백 함수라고 한다. 즉 사용자가 필요할 때 호출해서 쓰는 함수가 아닌 어떤 이벤트가 발생 했을 때 사용자에게 알려주는 역할을 하고 있다. 호출 되는 것 이다. 어떤 이벤트에 의해 해당 함수를 호출 하는 것 이다. 함수호출과 CallBack함수의 가장 큰 차이점은 제어권에 있다. 호출자가 -> 피호출자 호출 (일반적인 함수 흐름) 피호출자 -> 호출자 호출 (callback의 함수 흐름) 계속적으로 요청하는것과, 무슨일(이벤트)가 벌어졌을 때 요청되어지는것의 차이.. 더보기
Code injection (1) - Basic Code injection 이란 말그대로 code를 상대방 프로세스에 넣어 버리는 것 입니다.Dll injection에서 한단계 복잡하게 된 기술로서 주로 악성코드, 바이러스, 쉘코드등에 사용 됩니다.Dll은 백신에 탐지가 잘 되서, 좀더 복잡한 code injection을 많이 사용 합니다.code injection은 dll inejction과 달리 완전한 형태의 pe이미지를 가지고 하는것 이 아닌데이터와 코드만을 가지고 상대방 프로세스에 주입시킨후, 상대방 api주소를 구한뒤 원격으로 실행 시키는것이기 때문에 기법이 dll보다는 살짝 어렵다고 알려져 있습니다. 다른프로세스 메모리에 접근할 때 사용되는 api 입니다.Openprocess주입할 대상 process에 대한 핸들을 얻는다.VirtualAll.. 더보기
Python으로 레이싱 갤러리 사진 긁어 오기 http://jangc.tistory.com/17장모님 블로그를 보고 공부한것을 새로이 포스팅한 글입니다. >>> racingGirlUrl = http://gall.dcinside.com/list.php?id=racinggirl&no= 변수로 racingGirlUrl에 dcinside의 url주소를 가져 옵니다.파이썬에서는 ' 와 "의 묶음은 차이가 없습니다. >>> for no in range(170710, 170720): >>> print racingGirlUrl + str(no) 그 뒤에 for문을 이용해서 racinggirl&no=뒤에 넣을 숫자들을 돌립니다.그리고 print racingGrilUrl을 해주게 되면 결과값으로 http://gall.dcinside.com/list.php?id=rac.. 더보기