'Security'에 해당되는 글 15건

  1. 2017.03.08 pwnable.kr 문제 1
  2. 2017.03.05 20170305
  3. 2017.03.03 20170302..3
  4. 2017.03.02 20170301..2
  5. 2017.02.23 ㅁㅇㅇ 170223
  6. 2017.02.22 170222
  7. 2016.11.10 Reversing.kr-Easy_KeygenMe 풀이
Security/Reversing2017. 3. 8. 02:43

앞부분에 쉬워 보이는 문제는 금방 풀줄 알았는데..

3번이 날 가로막고 있음!!(사실2번도 예쁘게는 안했..)


그냥 엄청 단순한 BOF문제일 줄로만 알았는데, 뭔가

변조해야 하는 메모리 주소가 취약한 버퍼보다 낮은 주소에 있고,

스택 카나리도 적용이 되어 있는거 같다.


불가능..?


일단 함수 매개변수도 레지스터로 전달하고 있고, 아래쪽 위치한 메모리에 값을 넣어주고 있다

근데 소스코드에선..


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

이렇게 나와있다. 

key가 매개변수로 있으면 호출전에 스택에 푸시되거난 레지스터갖고만 처리하는거는 봤는ㄴ데

저렇게 되는게 맞는건지는 모르겠다..


---------------------------------------------------------------------------------


이 모든일이..

다운받은 ELF파일이 디버거로 동적분석이 안되서

소스코드 받아서 내가 다시 빌드한탓에

별게 다 적용되서 그랬던거였네ㅁ..(자체 난이도 상향..)


문제로 나오는 실행파일은

key가 버퍼보다 더 높은 주소에 있었음.

쉬운 문제였다ㅏ..ㅎㅎ

우분투에서는 문자열 넣는게 안먹히길래(python버전이 달라서 그런가..)

Fedora vm으로 들어가서 하니까 바로 됬다.



'Security > Reversing' 카테고리의 다른 글

RE.kr Twist  (0) 2018.01.09
Reversing.kr-Easy_KeygenMe 풀이  (0) 2016.11.10
리버싱 패턴-0  (0) 2016.11.08
Posted by Palette14
Security/뭐했니2017. 3. 5. 22:50

strace - 사용자 프로세스와 커널의 시스템콜이나 시그널 전달, 프로세스 상태등을 모니터링하고 조작할 수 있는 툴이다

C 로 만들어졌다 -> https://github.com/strace/strace


커널 기능인 ptrace(process trace)를 이용했음.

http://lxr.free-electrons.com/source/kernel/ptrace.c


이게 sandbox 로 사용될 수 있다고 한다

Sandbox(computer security)는 게스트 프로그램이 실행되도록 타이트하게 관리받고 있는 자원을 제공한다.

그 '자원'의 예로 scratch space가 있다


scratch space는 임시적인 공간임. 일정기간마다 데이터가 다 지워진다. 근데 동적으로 된다(?)

영구적으로 저장되는 백업공간으로 사용할 수 없음.

램이 부족하면 이 공간을 활용한다고도 함. 속도는 느림



'Security > 뭐했니' 카테고리의 다른 글

cache memory에 대한 이해  (0) 2018.01.16
toc-tou (time of check to time of use) - 1  (0) 2017.05.30
20170302..3  (0) 2017.03.03
20170301..2  (0) 2017.03.02
ㅁㅇㅇ 170223  (0) 2017.02.23
Posted by Palette14
Security/뭐했니2017. 3. 3. 02:56

CPUID 명령어(Intel opcode)

- id flag여부에 따라 사용가능/블가능(?)

- 64-bit mode 와 non 64-bit 모드에서 같은 연산을 함.

- 주로 프로세서 정보를 EAX, EBX, ECX, EDX에 리턴함

- EAX값을 인수로 받아서 처리함 in->out에 대해선 그때그떄..

나머지는 매뉴얼 보면 정말 잘 나와있음


Control Register

- CPU의 behavior(?대충 느낌으로) 를 바꾸거나 관리하는데 사용됨

- Interrupt control

- switching the addressing mode

- paging control

- coprocessor control ...> coprocessor는 CPU연산 도와주는얘였는데 요즘은 통합되거나(그래도 내부적으로 병렬) GPU형태로..?

- 종류 : 

CR0 : 별거다있음. 영문위키에 찾으면 다나옴 x86-64에선 64bit

CR1 : Reserved for the future use..ㅎㅎ

CR2 : Page Fault Linear Address값을 가지고 있음. page fault 발생시 프로그램이 접근하려 했던 주소값이 저장됨

-page fault : Memory Management Unit에 매핑되지 않은 메모리 페이지에 프로그램이 접근했을 때 하드웨어가 raise 하는 exception type. 에러라고 보지 않고, 운영체제가 프로그램에서 필요한 만큼의 메모리 양을 늘려주는 매커니즘 중 하나다(일반적이고 necessary) 나중에 좀더 공부해봐야겠음.


CR3 : Virtual Addressing 이 허용될 때 사용한다. CR0의 31번 비트가 켜져야 사용가능.

       페이징 디렉토리와 페이징 테이블을 이용해 프로세서가 선형주소를 물리주소로 변환하게 해줌.


CR4 : 보호모드에서 무슨무슨 연산 컨트롤할때 사용. 영문위키 gogo


이외에도 Model Specific Register같은거도 있었음



단어 몇개만 알면 왠만한 문서는 어느정도는 읽히는거 같음(물론 번역기나 사전이 필요해요..)


next : 파이썬으로 script 짤때 편해지는 모듈 공부하기/만들기(ㅎㅎ)

'Security > 뭐했니' 카테고리의 다른 글

toc-tou (time of check to time of use) - 1  (0) 2017.05.30
20170305  (0) 2017.03.05
20170301..2  (0) 2017.03.02
ㅁㅇㅇ 170223  (0) 2017.02.23
170222  (0) 2017.02.22
Posted by Palette14
Security/뭐했니2017. 3. 2. 02:41
학교에 들어왔음(여태껏 놀고...)
GCC 문서 읽음
IA-32매뉴얼 읽기 시작(ㅎㅎ..)
오래가길ㅠㅠ

'Security > 뭐했니' 카테고리의 다른 글

toc-tou (time of check to time of use) - 1  (0) 2017.05.30
20170305  (0) 2017.03.05
20170302..3  (0) 2017.03.03
ㅁㅇㅇ 170223  (0) 2017.02.23
170222  (0) 2017.02.22
Posted by Palette14
Security/뭐했니2017. 2. 23. 23:31

오늘 해킹방어대

ㅏㅁ여함


노트북 새로와서 툴들 다운받고 끝

'Security > 뭐했니' 카테고리의 다른 글

toc-tou (time of check to time of use) - 1  (0) 2017.05.30
20170305  (0) 2017.03.05
20170302..3  (0) 2017.03.03
20170301..2  (0) 2017.03.02
170222  (0) 2017.02.22
Posted by Palette14
Security/뭐했니2017. 2. 22. 02:42

버퍼 오버플로우 방지기법들


stack canary : 


GCC에서 SSP(stack-smashing protector) 기능에서 사용된다.

스택 return 주소 앞에 랜덤한 정수(canary)를 기록해 둬서, 그 수가 변경되었음을 체크하는 방식이다.

GCC SSP 기능에서는 canary는 난수+문자열 종결값("\n","\0", -1 같은 값들) 의 형태로 되어 있어서

문자열 덮어쓰기는 불가능함. 카나리값은 각 task_struct에 별도로 저장된다(task마다 다른 값)



메모리디버거 : 메모리 할당/해재 등을 감시. GC에서 필요로 함


실행 가능 공간 보호 : 특정 메모리 공간에서의 실행을 불가능하게 함. NX비트라는 기술 이용

CPU기술


UAF 취약점 : malloc()이 어떻게 돌아가는지

완전 기본적인 코드만 작성하고 끝남


Return to libc 공격 : ret을 libc에 있는 함수(시스템콜?)주소로 바꿔서 권한 따기


배열 초기화(?) 


어떤분이 열심히 작성해둔 글을 읽음. 컴파일러 공부의 필요성을 느낌(...)


함수 프롤로그, 에필로그


프롤로그 : 스택 프레임 포인터생성(호출한 함수의 프레임포인터 저장), 공간창출,

 사용할 범용 레지스터 백업(실행상태 보존)

에필로그 : 위에꺼 거꾸로...

레지스터 실행상태 복구, 스택복구, 프레임포인터 복구.


함수의 프롤로그 단계를 건너뛸 때, 함수 주소에 얼마를 더해주면(+3?) 됨. BOF나 다른 공격기법에

사용되지 않을까


64bit 체제에서는 __fastcall 이 아니여도 파라미터를 레지스터로 전달한다고 한다

옛날 자료들만 봐와서 64bit는 잘 모름. 역시 공부를..



PLT와 GOT : 리눅스에서는 동적 라이브러리 방식을 사용할땐 이렇게 함.

윈도우 PE의 IAT랑 비슷한 역할을 하는거같음. 자세한건 나중에 더..




vm 키기 너무 귀찮음..

맥이 있었으면..

살껄

'Security > 뭐했니' 카테고리의 다른 글

toc-tou (time of check to time of use) - 1  (0) 2017.05.30
20170305  (0) 2017.03.05
20170302..3  (0) 2017.03.03
20170301..2  (0) 2017.03.02
ㅁㅇㅇ 170223  (0) 2017.02.23
Posted by Palette14
Security/Reversing2016. 11. 10. 19:41

Reversing.kr - Easy_KeygenMe 풀기





/*


진짜 초보라 설명에 오류가 있거나

틀린 점이 있을수 있습니다..ㅠㅠ

열심히 공부해서 고쳐갈게요


*/


파일을 다운로드 하고 압축을 풀면 ReadME.txt파일이 있다. 내용은 다음과 같다.

Serial이 5B134977135E7D13일 때의 Name을 알아내라


구해야 하는 값을 알게 되었다.

프로그램 실행 시, 콘솔 창이 뜨면서, Name을 입력받고, Serial을 입력한다. 그리고 알맞은 값을 입력했나 판별한다.

문제 해결을 위해선 Name과 Serial의 관계를 알아야 한다.


일단 Ollydbg로 디버깅하자.


Ollydbg로 파일을 실행하고, 마우스 오른쪽 클릭 후 search for -> all referenced string메뉴로 들어가서

Serial Number를 입력하라는 문자열을 스택에 넣는 코드로 가본다

그러면 Serial Number와 Name의 관계를 찾을 수 있지 않을까?


Name 과 Serial Number는 분명히 어떠한 관계 속에 있고, 그 관계를 검증하는 방법을 알아내야 한다

(중간과정 생략)

.

.

.




명령어에서 Serial Number를 저장하고 있는 [ESP+10]의 주소와 의문의 문자열 [ESP+74] 주소를 레지스터에 넣어 반복문으로 같은지 비교하고 있다. 같고 다름에 따라 함수 호출을 위해 스택에 넣는 문자열이 달라진다.

아마 이 함수가 맞는 값을 입력했는지 알려주는 함수임에 틀림없다(breakpoint 잡고 직접 해보길 바래ㅁ)

같으면 "Correct!" 문자열을 출력하고, 같지 않으면 "Wrong" 문자열을 출력한다.


아마도 ESP+74에 있는 문자열은 입력한 Name이 재료가 되는 Serial Keygen 방식으로 만들어진 문자열일 것이다.


 


.

그럼 일단 Serial Keygen에 필요한 재료인 Name을 입력받는 곳으로 가보자.

00401059에 있는 CALL 004011A2이 Name을 입력받는 함수고 호출하고, 호출인자로 넣은 주소인 ESP+10가

입력받은 문자열을 저장할 부분이 될 것 같다.


이후엔 저장된 문자열의 길이를 구한다. >> 자주보이는 리버싱 패턴

만약 문자열 길이가 0이면 반복이 끝난 지점으로 보내버린다. 아마 문자열 입력받는 코드로 다시 가는 등

프로그램이 알아서 처리할것이다.


반복문(Keygen routine)


0040107C부터 보이는 루프가 Serial Keygen 루틴일 것이다

처음에는 ESI의 값이 3보다 크면, 값을 0으로 만들어버린다. 분명 무슨 역할을 할 것이다.


위 조건문을 통과하면, ECX에는 스택상에 있는 특정 값을 넣는다. 그런데 이때 ESI가 주소값에 영향을 준다. 

EDX에는 아까 입력한 Name값의 주소를 넣어준다.

근데 여기에도 EBP값이 이에 영향을 미치게 된다(EBP를 변수처럼 사용. BASE POINTER아님)

아마 각각의 문자에 접근하려고 할 것 같다.

그러면, ECX에 들어갈 값, ESI+ESP+0C엔 뭐가 들어있을까...?


바이트 단위로 0x10, 0x20, 0x30 값이 차례로 들어 있다. 그뒤엔 아까 입력한 Name이 저장되어 있다.

반복문의 조금 뒤쪽을 보면, 반복할때 마다 ESI를 1 증가시켜주는 코드가 있다(004010AC)

ESI가 3 보다 크면 값을 0으로 만들어 준다는 내용과 종합해 보면, ECX에 들어가는 값은 차례대로 0x10, 0x20, 0x30뿐이고, 0x30값 후엔 다시 0x10값을 갖게 된다.


EDX에 넣은, Name값의 주소인 EBP+ESP+10도 마찬가지로, 뒤에 반복할때 마다 EBP가 1씩 증가하는 코드가 있다(004010A2)

즉, EDX의 값은 문자열의 인덱스와 같은 역할을 할 것이다.

.

.

.

그 뒤에는 XOR이 나온다.

첫 반복때엔 Name 맨 첫번째 값 0000 0041(16)과 0000 0010(16)값을 xor연산하여 ECX에 넣어둔다.


후에 함수가 하나 호출되는데, 매개변수를 보고 한번 맞춰보자 ㅎㅎ


스택에는 나중에 입력받을 Serial number와 비교하는 문자열인 ESP+74의 주소를 넣는다.

그 후, "%s%02X" 문자열 주소를 스택에 또 넣고 ESP+7C 주소도 넣는다. 이렇게 스택에 값을 넣어두고, 함수를 호출한다.


그러면 함수 매개변수가 전달되는 꼴은 " 함수명( ESP+7C , "%s%02x"문자열주소, dest주소, xor된 hex값) " 이렇게 될 것이다.

특정 주소에 문자열을 쓰는 함수이라는 것을 짐작할 수 있고, 아마 C언어의 sprintf 함수일 것이다.


아래는 sprintf함수의 원형이다

int sprintf (char *s, const char *template, ...)


sprintf함수의 첫번쨰 매개변수는 문자열 데이터를 쓸 주소

두번쨰 매개변수는 쓸 문자열(형식문자 포함)

나머지 가변 매개변수는 형식문자에 대응하는 변수들이다.


위처럼 하게 되면, 아마 반복될때마다 원래의 문자열은 %s로 유지되고, xor된 hex값이 2자리로 쓰여질 것이다.

즉 끝에다가 이번에 XOR한 값을 추가해준다.

문자열 길이를 구해 ECX에 넣고, 위에서 Name문자열의 순차적으로 증가하는 인덱스 역할을 할 EBP가 그보다 작으면 반복을 돈다.

아래는 Name을 ABCD로, 반복문을 다 돈 후의 ESP+7C주소의 dump

이렇게 값이 들어간다.


Serial Key 생성 루틴


반복문에서, 0x10, 0x20, 0x30값을 차례로 갖으며, 0x30값을 가진 후에는 다시 0x10값을 갖는 변수가 있다.

그리고, Name문자열을 스캔해서 차례대로 값을 갖는 변수가 있다.

변수는 문자의 ASCII 디코딩 값을 갖는다.


그렇다면, XOR역연산으로 우리에게 주어진 Serial Number값을 이에 해당하는 Name 값으로 바꾸면 된다



파이썬을 잘 못해서 대충 역연산을 해보니 저런 hex값이 나왔다. 저걸 ASCII코드로 encoding하면 된다. 



Name : K3yg3nm3


-----------------------------------------


파이썬이 정말 좋은데 함수나 모듈에 대해 너무 모르는거같다ASCII변환.. 

공부해서 더 잘해졌으면 좋겠다 ㅎㅎ

그런데, 비교하는 루틴에 넣는 주소는 ESP+74고, 만들어진 Serial Key 주소는 ESP+7C이다..??


  









'Security > Reversing' 카테고리의 다른 글

RE.kr Twist  (0) 2018.01.09
pwnable.kr 문제  (1) 2017.03.08
리버싱 패턴-0  (0) 2016.11.08
Posted by Palette14