pwnable.kr - echo1
exploit을 적용해야하는 프로젝트를 진행하고 있는데, 그 공부를 하던 중 익스 공부를 너무 쉰거같다는 느낌을 받아서 pwnable.kr 의 echo1 문제를 풀게 되었습니다.
소스 코드는 요즘 ida에서 왠만한 거는 다 번역해주니 필요한 부분만 올리겠습니다.
우선 취약점이 터지는 부분은 echo1() 함수 안에서 였습니다.
__int64 echo1()
{
char s; // [bp-20]
(*((void (_QWORD))o + 3))(o); //greetings
get_input(&s, 128LL); //get_input
puts(&s);
(*((void (_QWORD))o + 4))(o); //byebye()
return 0LL;
}
이 부분인데
main 함수 안에서
id = user_name[0]; //input value(8byte)
getchar();
func[0] = (__int64)echo1;
...
...
...
puts("\n- select echo type -");
puts("- 1. : BOF echo");
puts("- 2. : FSB echo");
puts("- 3. : UAF echo");
puts("- 4. : exit");
printf("> ", v3);
v3 = &selection;
__isoc99_scanf("%d", &selection);
getchar();
if ( (unsigned int)selection > 3 )
break;
((void (const char *, int *))func[(unsigned __int64)(unsigned int)(selection - 1)])("%d", &selection);
1번을 선택하면 echo1 함수를 호출 할 수가 있습니다.
나머지 echo2나 echo3은 함수는 이 문제에서는 신경 쓸 필요가 없었습니다.
echo1 함수 안을 보면
32크기의 s 변수에 128 만큼의 값을 쓸 수 있도록 만들어 놓았습니다.
그렇다면 ret 까지 덮어서 원하는 공격을 수행할 수 있습니다.
일단 취약점이 터지는 부분은 알았는데 어떻게 공격을 수행해야 할까요??
저기 빨간색글씨들이 공격에 필요한 요소들입니다.
-----------------------------------------------------------------------------------------
프로그램을 보면,
1. name을 입력받는다.
2. id에 입력한 name을 저장한다.
3. 메뉴를 선택한다.
4. 1번 선택시 echo1() 함수로 들어간다.
5. echo1()에서 변수 s 를 덮어 씌울 수 있는 입력을 수행할 수 있다.
----------------------------------------------------------------------------------------
페이로드는 아마도...이런식?? 이 될 꺼같아요..(64bit임을 주의)
payload = | nop slop(32) | rbp (8) | ret | ......|
우선 id 가 중요하게 작용합니다. 저두 이걸 몰라서 해맸었습니다.
왜냐면 id 변수는....
bss영역에 있었습니다. 이 영역은 해커들의 영역이라고도 불리며 aslr의 영향을 받지 않는 곳으로 알려져 있습니다.
id 변수에서 내가 입력한 name을 저장하고, 그 name은 8 byte이므로 확실히 이 곳에 필요한 주소를 넣어 줄 수가 있습니다.
그럼 이 곳에 어떤 주소를 넣어 주어야 할까요?? 아마 jmp rsp 아닐까요??
왜냐하면 저는 사용할 페이로드가
'A'*32+'b'*8+'id_addr(ret)'+'shellcode(64 bit)'
이기 때문입니다. 처음 32bit 쉘코드를 넣다가 계속 안되서 64bit임을 알고 찾아서 넣어줬더니 성공했습니다.
여기서 ret 을 하게 되면 id주소로 뛰게 되고(.bss 영역) id에는 jmp rsp 의 주소가 들어있기 때문에 jmp rsp 명령이 수행되게 됩니다.
ret이 수행되고 난후 스택은 rsp+8(64bit)가 되고 넣어준 shellcode를 가리키게 됩니다.
그럼 파이썬으로 익스코드를 짜서 공격을 할 수가 있습니다.
풀이는 여기 까지 하겠습니다!!!
0 개의 댓글