<WAR GAME>/pwnable.xyz
[pwnable.xyz] Dirty_Turtle
dlrudwo
2024. 7. 5. 17:28
보호기법
카나리와 nx가 활성화 되어있다.
코드 분석
main()
int __cdecl main(int argc, const char **argv, const char **envp)
{
char *s; // [rsp+0h] [rbp-10h]
unsigned __int64 val; // [rsp+8h] [rbp-8h]
setup(argc, argv, envp);
puts("Dirty Turtle Off-RoadS");
printf("Addr: ");
s = get_val();
printf("Value: ");
val = get_val();
if ( val )
*s = val;
else
puts(s);
return 0;
}
get_val() 함수를 호출해 s에 반환값을 전환하고, 그 다음 한번 더 호출하여 val에 저장한다. 그 다음 val이 0이 아니라면 s 주소에 val을 값으로 넣어준다.
get_val()
unsigned __int64 get_val()
{
__int64 buf[6]; // [rsp+0h] [rbp-30h] BYREF
buf[5] = __readfsqword(0x28u);
memset(buf, 0, 32);
read(0, buf, 0x20uLL);
return strtoull(buf, 0LL, 0);
}
buf에 0x20만큼 입력을 받고 strtoull 함수로 입력받은 buf를 부호없는64비트 정수로 변환해서 반환 해준다.
win()
int win()
{
return system("cat flag");
}
플래그를 읽을 수 있는 win 함수가 있다.
익스플로잇 시나리오
https://ddongfary.tistory.com/35
main 함수 호출, 종료되는 과정
elf 파일을 보통 디버깅 할 때 main문부터 확인하는게 일반적이다. 그러나 pwnable.xyz의 Dirty_Turtle이란 문제를 보면 main함수가 호출되기까지, 종료된 후의 과정을 알아야한다.1. ELF 헤더 확인우선 reade
ddongfary.tistory.com
get_val() 함수로 원하는 위치에 win 주소를 넣을 수 있다. 그러나 got overwrite할 함수가 없다. 따라서 main 함수가 종료되고 소멸자가 동작하는 루틴을 이용해 특정 함수 부분을 win함수로 변경하면 된다.
익스플로잇
fini_array 주소를 s에 저장하고 해당 주소에 win 함수 주소를 넣으면 플래그를 얻을 수 있다.