Search

[pwnable.xyz] Dirty Turtle

tag
writeup
pwn
Date
2022/01/10 14:09
Category
pwnable.xyz

1. 문제

1) mitigation 확인
PIE와 RELRO가 안걸려있다.
2) 문제 확인
뭔 주소를 받는다. 뭐지? 모르겠다. 코드를 봐보자
3) 코드 확인
main() 함수
int __cdecl main(int argc, const char **argv, const char **envp) { char *s; // [rsp+0h] [rbp-10h] unsigned __int64 v5; // [rsp+8h] [rbp-8h] setup(argc, argv, envp); puts("Dirty Turtle Off-RoadS"); printf("Addr: "); s = (char *)get_val(); printf("Value: "); v5 = get_val(); if ( v5 ) *(_QWORD *)s = v5; else puts(s); return 0; }
C
복사
get_val() 함수를 호출해서 반환값을 s에 저장한다. 그다음 한번더 호출해서 v5에 저장하고, v5가 값을 가지고 있으면 해당 값을 s에 넣는다. 그게 아니면, puts(s) 를 호출하고 종료가 된다
get_val() 함수
unsigned __int64 get_val() { __int64 buf; // [rsp+0h] [rbp-30h] __int64 v2; // [rsp+8h] [rbp-28h] __int64 v3; // [rsp+10h] [rbp-20h] __int64 v4; // [rsp+18h] [rbp-18h] unsigned __int64 v5; // [rsp+28h] [rbp-8h] v5 = __readfsqword(0x28u); buf = 0LL; v2 = 0LL; v3 = 0LL; v4 = 0LL; read(0, &buf, 0x20uLL); return strtoull((const char *)&buf, 0LL, 0); }
C
복사
rws 였나 그 문제와 동일하게 strtoull 함수를 사용하는 것을 볼 수 있다.

2. 접근방법

이 문제는 알아야 하는 개념이 있다
get_val() 함수로 원하는 위치에 win함수 주소를 넣을수 있다. no PIE이므로 got overwrite를 하면 되지만, overwrite할 함수가 없다;;. 따라서 main 함수가 종료되고 소멸자가 동작하는 루틴을 이용하여 특정 함수 부분을 win함수로 변경하면 된다.
자세한 내용은 위 내용을 참조하면 된다. 결국 우리는 fini_array주소를 s에 저장하고 해당 주소에 win함수를 밖으면 끝이다.

3. 풀이

4. 몰랐던 개념

전에 드림핵 시스템 해킹 강의를 쫌보다가 init_array, fini_array 부분을 봤었는데 그때는 넘겼다. 하지만 이번 문제에서 해당 개념을 알아야 할 필요가 있어서 다시 가서 봤다. 그때는 이해가 안됬는데 지금 다시보니 이해가 됬다. 굳