ii4gsp

FTZ - Level14 본문

시스템 해킹/FTZ

FTZ - Level14

ii4gsp 2020. 1. 9. 20:34

힌트를 보면 gets()함수가 아닌 fgets()함수를 써서 45byte만큼의 입력만 받아 ret변조를 불가능하게 만들어뒀다.

check의 값을 0xdeadbeef로 변조를해서 쉘을 실행시켜야한다.

 

 

 

 

attackme를 tmp에 복사하고 gdb로 분석을 해보자

<main+3>에서 0x38만큼 할당해주었다.

0x38은 10진수로 56byte이다.

crap[4byte] + check[4byte] + buf[20byte] = 28byte

컴파일러가 생성한 dummy는 28byte이다.

<main+27>에서 0xffffffc8은 2진수로 1100 1000인데 1의 보수를 해주면 0011 0111에서 2의 보수를 구하면 +1이 되니 56이된다.

ebp-56 위치 주소를 eax로 옮기는 걸 알 수 있다.

<main+30>에서 eax를 스택에 올리고 fgets()함수를 호출한다.

buf배열의 크기는 ebp-56부터 20만큼이니 ebp-36까지다.

<main+39>부분에서는 0xfffffff0 즉 1111 + 1인 16

ebp-16과 0xdeadbeef이 문자열 비교를 한다.

buf와 check 변수 사이에 20만큼의 더미가 있는 걸 알 수 있다.

입력한 값이 저장된 부분과 문자열을 비교하는 부분까지 40byte의 빈 공간이 있는데 이 공간에 쓰레기 값을 입력하고 check 변수에 들어갈 deadbeef 값을 리틀 엔디언 방식으로 넣어주면 될것이다.

 

 

 

 

buf와 check사이의 빈공간 40byte의 값을 채워주고 check변수에 0xdeadbeef를 리틀엔디언 방식으로 \xef\xbe\xad\xde로 넣어주면 된다.

 

 

 

payload

(python -c 'print "\x90" * 40 + "\xef\xbe\xad\xde"';cat) | .attackme

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

FTZ - Level16  (0) 2020.01.10
FTZ - Level15  (0) 2020.01.10
FTZ - Level13  (0) 2020.01.08
FTZ - Level12  (0) 2020.01.08
FTZ - Level11  (0) 2020.01.07
Comments