상세 컨텐츠

본문 제목

[FC3] gate -> iron_golem

SYSTEM HACKING/LOB Fedora Core

by koharin 2019. 7. 5. 18:38

본문

728x90
반응형

Fake_SFP + Ascii Armor

 

 

#Fake_SFP + AScii Armor

 

Fake_SFP : 함수 에필로그에서 leave 명령어는 mov %ebp, %esp와 pop %ebp 실행하는데, leave 명령어가 실행되는 스택의 위치가 SFP(Save Frame Pointer)이다. SFP는 전 스택 프레임의 ebp값을 저장하고 있는데 이 SFP값을 바꾸면 ebp를 조작하는게 가능하다.

 

Ascii Armor : 공유 라이브러리의 최상위 바이트가 0x00이라서 연속적인 payload 전달 불가

 

#필요한 것 

 

버퍼부터 SFP, RET까지의 거리 

return address를 덮고 실행할 함수 주소

SFP를 덮고 ebp를 바꿔서 인자로 참조하기에 적당한 주소

 

 

 

ex.py -> LOB level 20에서 작성한 것처럼 exploit 파이썬 코드일 것이다.

iron_golem -> 공격해야할 실행파일

shell -> shellcode가 아닌 이 shell 실행파일을 사용해 shell을 얻어야 할 것이다.

 

 

 

? 파일은 심볼릭 링크 파일인데, shell에 화살표가 가있는 것을 보니 shell의 내용과 연결되어 있을 것이다.

? 파일도 사용해야 하는 것 같다.

공격해야 할 파일인 iron_golem에는 s가 있어서 setuid가 걸려있음을 알 수 있다.

uid와 gid 모두 iron_golem이라서 공격에 성공 시 iron_golem 권한을 얻을 수 있다.

 

 

$ cat iron_golem.c

 

 

★ char buffer[256] : buffer의 크기 256. 하지만 stack dummy 조건으로 인해 dummy가 붙을 것

★ if(argc < 2) : 인자를 1개만 주면 (실행파일 이름만 주면) 종료됨

★ strcpy(buffer, argv[1]) : argv[1]로 밭은 문자열을 buffer에 복사. Strcpy 함수는 문자열 길이에 상관없이 NULL 문자를 만날 때까지 복사해서 bufferoverflow 취약점이 있다.

★ printf(“%s\n”, buffer) : buffer 출력

 

 

$ cat shell.c

 

 

System 함수를 통해 “/bin/sh”를 해서 권한을 얻는 shell이다.

Shell.c이 컴파일된 shell 실행파일도 줬다.

 

 

 

 

p32 = lambda x : struct.pack(‘<I’, x) : x를 16진수 형태로 바꿔주는 것이 p32

f_ebp = 0x8049618 : 아래 보면 알 수 있듯이 GOT 주소이다. execl 함수의 인자로 사용한다.

-> GOT 주소의 끝은 항상 0x00000000이기 때문에 ebp를 GOT 영역으로 변조했을 때 마지막이 0이 되기 때문에 execl 함수의 인자로 적당하다. (execl 함수는 마지막이 NULL로만 끝나면 되기 때문에)

 

execl 함수는 인자를 현재 폴더에서 실행시킬 경우에는 execl(“iron_golem”, NULL); 과 같이

인자 부분을 NULL로 처리해도 되지만,

execl(“/bin/sh”, NULL); 과 같이 파일명을 전체 디렉터리 경로로 표현할 경우 세그먼트 에러가 난다.

따라서 execl(“/bin/sh”, “arg1”, NULL); 이렇게 반드시 인자 하나는 들어가야 한다.

 

 

execl = 0x7a5720 : execl 함수를 이용해 exploit한다. execl 함수의 주소

 

 

 

f_ebp가 가지는 주소는 GOT(Global Offset Table)의 주소였다.

지금 GOT가 0x0804954c라는 주소를 가지는 함수의 주소를 가리키고 있다.

이 함수 대신 다른 execl 함수의 주소를 이 GOT에 넣어서 원래 함수가 아닌 execl 함수가 실행되도록 하려는 것 같다.

 

 

$ /usr/bin/nm iron_golem

 

 

으로 GOT 주소를 확인해봐도 0x8049618임을 알 수 있다.

또한 GOT 주소는 고정 주소이므로 random stack의 영향을 받지 않는다.

이 GOT 주소를 SFP에 넣는데 적당하다.

 

 

$ gdb -q iron

(gdb) disass main

 

 

 

Main + 81 부분이 strcpy 함수를 호출하는 부분인데, 첫번째 인자값으로 ebp-264를 받는 것으로 보아 buffer에서 sfp까지의 거리가 264인 것을 알 수 있다.

따라서 위의 ex.py의 payload 작성 시 264까지를 dummy로 채웠다.

 

 

#심볼릭 링크를 걸어줄 값 찾기

 

 

 

GOT 맨 처음에 있는 0x804954c를 보면 0x00000001을 가리키고 있고, 그 다음도 0이다.

하지만 ebp로 0x8049618을 사용하면 안 된다.

왜냐하면 execl 함수가 인자를 참조하는 방식이 첫 번째 인자를 ebp + 8인 위치로 처리하기 때문에

0x8049618 주소에서 8을 빼야한다.

=> ebp로 바꿀 주소이자 SFP를 덮을 값: 0x8049618 – 0x8 = 0x8049610

ex.py에서 알 수 있듯이 payload 작성 시 f_ebp – 0x8을 넣는 곳이 SFP이다.

 

 

 

# execl의 인자 처리 방식을 주의!

 

(gdb) disass execl

 

 

execl 함수의 프롤로그 부분을 보면, ebp를 push하고 현재 esp값을 ebp로 바꾸는 작업을 한다.

이 부분에 의해 원하는 ebp값을 설정할 수 없다.

따라서 프롤로그 과정 다음으로 eip를 넘겨서 함수 프롤로그 없이 execl 함수가 실행될 수 있도록 한다.

=> RET을 덮을 주소: 0x007a5723 (execl+3)

 

# setuid 함수와 쉘을 실행시키는 프로그램 만들어 심볼릭 링크 걸기

 

이 shell은 주어져 있다. 심볼릭 링크도 ? 가 있다.

주어져 있지만 심볼릭 링크를 사용하는 이유는,

 

 

 

아까 GOT에서 0x00000001 부분을 가리키고 있어서 이 부분을 사용하기로 했다.

이 부분의 이름이”0x01”이므로

 

$ ln -n shell ‘python -c ‘print “\x01”’`

 

이렇게 해주면 파일 이름이 "0x01"인 shell의 심볼릭 링크 파일이 만들어지는데, 우리가 원하는 그 위치의 이름으로 설정ㅎ

 

#payload 작성

 

buffer(256) + dummy(8) + SFP(4) + RET(4)

 

“A”*264 + SFP(0x8049610) + RET(0x007a5723)

 

 

#공격코드 작성

 

$ ./iron `python -c ‘print “A”*264+”\x10\x96\x04\x08”+”\x23\x57\x7a\x00”

 

 

 

이번에 Ascii Armorexecl+3의 주소가 0x007a5723이라서 payload 전달 시 RET까지만 전달되고 아마 끊길 것이다.

하지만 이번 레벨에서는 다행히 RET 이후에는 없어서 payload가 끊기지 않았다.

기술문서의 Fedora Core 3에서 RTL 기법 부분을 참고했더니 쉽게 풀 수 있었던 것 같다.

또 ex.py 파일에서 payload를 다 줘서 payload 이해만 한다면 공격코드 작성은 어렵지 않을 것 같다.

 

“blood on the fedora”

728x90
반응형

'SYSTEM HACKING > LOB Fedora Core' 카테고리의 다른 글

[FC3] evil_wizard -> dark_stone  (0) 2019.07.12
[FC3] hell_fire -> evil_wizard  (0) 2019.07.12
[FC3] dark_eyes -> hell_fire  (0) 2019.07.12
[FC3] iron_golem -> dark_eyes  (0) 2019.07.06
[FC3] 환경/메모리 보호 기법 요약  (0) 2019.07.04

관련글 더보기