2010.02.20 20:25 WarGame




level2 보다 다소 난이도가 상승했군요

쉘코드를 삽입해야 하고

exit 때문에 일반적인 bof는 통하지 않습니다

일단 Reading Material 의 dtors 영역을 이용하는 방법을 읽어보도록 합시다

dtors 영역을 bof에 적용해보기는 처음이군요

fsb 에서는 그 영역에 접근해서 수정하는게 가능했지만..

아무튼 dtors 영역을 이용하라는 힌트도 얻었으니

본격적으로 분석으로 들어가봅시닼



dtors 영역의 주소를 알아낸 모습입니다

0x8049000 이후에 자리잡고 있군요

스택과는 너무 동떨어져있어서 어떻게 손대야 하나 했습니다만

문제에 답이 있습니다

전역 변수가 어디에 저장되는지 기억을 해내신다면

문제 푸는게 훨씬 수월해집니다

다시 objdump 로 확인해봅시다



0x8049490 부터 data 영역의 시작입니다

data 영역에는 val 값과 lp 값 [ val의 주소 ] 가 들어있을 것이라고 짐작할 수 있습니다

31337... 16진수로 7a69 입니다

감이 오시나요?

좀더 자세히 확인해보기 위해서 gdb로 열어보죠




흠.. dso_handle , p.0 , val, lp 값이 있군요

일단 val에는 7a69 가 들어있는걸 확인했습니다

lp는 val의 주소 0x804949c가 들어있구요

자 이제, 우리가 이 값을 어떻게 수정할 수 있을지 코드를 뜯어봅시다

이중 포인터까지 나오는 아름다운 코드로군요 -.-





먼저 lp -> val 인 상황에서 lpp가 lp를 가리키게 했습니다

즉, lpp-> lp -> val

이고 tmp 는 지정을 해주지 않았군요

그리고 buf[128] 를 할당하고

bof의 인기함수 strcpy가 등장합니다

인자를 buf에 덮어씌우는군요

다음은 lpp가 0x8040000 영역을 지정하는지 검사합니다

일반적인 경우라면 val을 가리키고 있으므로 걸릴게 없겠죠

그리고.. 주의 깊게 보셔야 될게

**lpp = (unsigned long) & buf

바로 이부분입니다

lpp가 포인팅 하고 있는 곳의 포인터 값에 buf의 주소값을 넣는다

말이 좀 어려운가요?

그러니까 현재 상황에서 보자면

lpp -> lp -> val 이니까  val 값에 buf의 주소를 넣어준다

이 말이 되겠죠

tmp는 크게 신경을 쓰지 않아도 될것 같습니다

자 그럼 이제 어떻게 해야 할까요

dtors 가 우리가 생성한 쉘코드 값이 있는 곳을 가리키도록 하면 되겠죠

dtors -> buf 이렇게요

그런데 좀전에 lpp -> lp -> val [31337 ]  기억하고 계신가요?

val 에 buf의 주소가 들어가죠

lpp -> lp -> val [ &buf ]

이 부분을 이용할 수 있겠군요

lpp -> lp -> dtors [ &buf ]

이렇게 넣어준다면 dtors 영역의 값이 buf 주소로 들어가고

쉘 코드 값이 실행 될 수 있습니다

슬슬 복잡해지죠?

자 그럼 lp가 dtors를 가리키도록 해야 합니다

우리는 stack에 위치한 lpp 의 값을 바꿀순 있습니다만

lp 의 값을 직접적으로 바꿀순 없습니다


좀전에 data 영역의 값을 유심히 살펴보신분이라면

금방 방법을 찾으셨을 거라 생각합니다

_dso_handle
p.0
val
lp

이렇게 있었죠

p.0 의 값을 기억하나요?

0x080494558

네 dtors 영역이군요

p.0 가 dtors를 가리키고 있다

이걸로 문제는 또 한꺼풀 풀렸습니다

그러니까 최종적인 포인터 값은

lpp -> p.0 -> dtors

바로 이렇게 됩니다

자 이제 lpp에 p.0값을 넣어주고

buf에 쉘코드 값을 넣어주는 것만 남았군요

각 변수들의 dummy byte 만 찾아내면 됩니다

음 lpp 의 원래 값은 알고 있죠?

0x80494a0 입니다

gdb로 처음에 152 byte 만큼 할당해주신걸 기억해주신다면...

buf [ 128 ] + dummy1 [ ?? ] + tmp [ 4 ] + lpp [ 4 ] + dummy2 [ ??? ] = 152

이렇게 되신걸 알수 있겠죠

일단 인자로 아무값이나 128 개를 넣고 그 값 이후로 어느 정도 떨어진 지점에

저 주소값이 있는지 봅시다

그럼 dummy 1 의 크기를 알아낼수 있겠죠




0x90909090 이후로 8byte의 텀이 있는걸 볼 수 있습니다

tmp 까지 덮어씌워야 하니까 12byte 겠죠

어떻게 최종 코드를 짜셔야 하는지 감이 오시나요?

shell code  + dummy   =  128 + 12

쉘코드는 여기있던걸
http://www.shell-storm.org/shellcode/files/shellcode-399.php

썼답니다




\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46
\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68
\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80

총 34바이트 입니다

그러니까 이제 dummy 106byte 를 넣어주고 마지막으로

lpp 에 p.0 의 주소값을 넣어주면 되죠

최종 코드 입니다






어때요 참 쉽..지는 않군요?

'WarGame' 카테고리의 다른 글

[Python Challenge] level1 풀이  (0) 2010.03.05
[ Padocon 2010 ] Crackme 100 Breakme 풀이  (0) 2010.02.28
Vortex level3 풀이  (0) 2010.02.20
Vortex level2 풀이  (0) 2010.02.16
Vortex level1 풀이  (0) 2010.02.10
Vortex level0 풀이  (0) 2010.02.04
Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday23
Today34
Total330,243

달력

 « |  » 2019.7
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

최근에 받은 트랙백

글 보관함


. .