본문 바로가기

[Pwnable] 해커스쿨 FTZ

[해커스쿨 FTZ] level18

이번엔 level18 이다. 두문제 남았다...

로그인을 하고 파일목록을 확인하고, 힌트를 확인하는데 이번엔 힌트가 꽤 길다.

흠.. 코드를 분석해보자.

 

이걸 종합해서 간단하게 설명하면 check 변수의 값이 0xdeadbeef 면 shellout 함수를 호출해서 쉘을 실행하는 프로그램이다.

 

하지만 이전 문제들과는 다르게 string[100] 선인보다 check 변수 선언이 뒤에 나와서 지금까지 해온 방법을 쓸 수가 없다.

 

눈여겨볼 부분은 count 변수에 0x08 이 입력으로 들어오면 1 감소시킨다는 것인데

이는 배열의 인덱스가 -(마이너스) 가 되게하면 뒤에 나온 check 변수까지 접근을 할 수 있다는 뜻이다.

 

대충 방법을 생각해놨으니 해야 할것을 적어보자.

ⓐstring ~ check 사이의 거리를 구하고 ⓑcheck 에 0xdeadbeef 에 덮어씌우는 페이로드를 작성하면 될 것 같다.

 

gdb를 통해 필요한 것들을 알아내자.

너무 길기 때문에 필요한 부분만 보면,

main+91 에서 check ~ ret 사이의 거리를 구할 수 있다.

check ~ ret 거리 = 104 + 4 = 108

 

main+499 에서 string ~ ret 사이의 거리를 구할 수 있다.

(밑에 inc (하나씩 증가) 가 있는걸로 보아 ebp-100 이 string 부분임을 알 수 있다.)

string ~ ret 거리 = 100 + 4 = 104

 

따라서 string ~ check 사이의 거리 = 104 - 108 = -4

 

string 에서 check 까지 도달하려면 -4 만큼 가야한다. => 0x08을 네번 이용한다.

 

페이로드를 작성해보자.

 

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

 

과연?

 

짜잔

 

level19 암호 : swimming in pink

'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level20  (0) 2020.03.12
[해커스쿨 FTZ] level19  (0) 2020.03.12
[해커스쿨 FTZ] level17  (0) 2020.03.12
[해커스쿨 FTZ] level16  (0) 2020.03.12
[해커스쿨 FTZ] level15  (0) 2020.03.12