728x90
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;
}
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);
}
rws 였나 그 문제와 동일하게 strtoull 함수를 사용하는 것을 볼 수 있다.
2. 접근방법
이 문제는 알아야 하는 개념이 있다
get_val() 함수로 원하는 위치에 win함수 주소를 넣을수 있다. no PIE이므로 got overwrite를 하면 되지만, overwrite할 함수가 없다;;. 따라서 main 함수가 종료되고 소멸자가 동작하는 루틴을 이용하여 특정 함수 부분을 win함수로 변경하면 된다.
자세한 내용은 위 내용을 참조하면 된다. 결국 우리는 fini_array주소를 s에 저장하고 해당 주소에 win함수를 밖으면 끝이다.
3. 풀이
4. 몰랐던 개념
- 전에 드림핵 시스템 해킹 강의를 쫌보다가 init_array, fini_array 부분을 봤었는데 그때는 넘겼다. 하지만 이번 문제에서 해당 개념을 알아야 할 필요가 있어서 다시 가서 봤다. 그때는 이해가 안됬는데 지금 다시보니 이해가 됬다. 굳
728x90
'워게임 > pwnable.xyz' 카테고리의 다른 글
[pwnable.xyz] notebook (0) | 2020.05.17 |
---|---|
[pwnable.xyz] nin (0) | 2020.05.16 |
[pwnable.xyz] Hero Factory (0) | 2020.05.13 |
[pwnable.xyz] note v2 (0) | 2020.05.13 |
[pwnable.xyz] badayum (0) | 2020.05.12 |