이번엔 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 |