glibc-2.27
#1. 문제 살펴보기
더보기
< 1. createUser >
unsigned __int64 createUser()
{
char **v0; // rbx
char buf; // [rsp+0h] [rbp-40h]
unsigned __int64 v3; // [rsp+28h] [rbp-18h]
v3 = __readfsqword(0x28u);
root = malloc(0x10uLL);
printf("Enter age of user: ");
__isoc99_scanf("%d", (char *)root + 8);
printf("Enter username: ");
read(0, &buf, 0x1FuLL);
v0 = (char **)root;
*v0 = strdup(&buf);
return __readfsqword(0x28u) ^ v3;
}
< 2. editUsername >
ssize_t editUsername()
{
if ( !root )
bye();
printf("Enter age of user: ");
__isoc99_scanf("%d", (char *)root + 8);
printf("Enter username: ");
return read(0, *(void **)root, 0x1FuLL); // BOF
}
< 3. deleteUser>
void deleteUser()
{
if ( !root )
bye();
free(root); // UAF
}
< 4. sendMessage >
unsigned __int64 sendMessage()
{
char buf; // [rsp+0h] [rbp-90h]
unsigned __int64 v2; // [rsp+88h] [rbp-8h]
v2 = __readfsqword(0x28u);
puts("Enter message to be sent: ");
read(0, &buf, 0x7FuLL);
puts("Message recieved: ");
puts(&buf);
puts("\nSaving it for admin to see!\n");
message = (__int64)strdup(&buf);
return __readfsqword(0x28u) ^ v2;
}
sendMessage()에 strdup() 라는 함수가 있다.
strdup() 는 1. malloc을 통해 공간을 할당한 뒤
2. 그 공간에 인자의 문자열 값을 복사하고
3. 할당된 주소값을 반환한다.
이 문제에서는 전역변수 message 에 반환이 되겠다 !
editUsername()에서 BOF 가 발생한다
아마 message 의 값을 덮을 수 있을 것 같다.
하지만 PIE 가 걸려있고
출력할 수 있는 루틴이 없다 ! ! !
#2. 문제 분석하기
파일을 실행하고 나서 바로 메모리상태를 확인해보면
heap에 관리를 위한 chunk와 top chunk를 제외하고
1개의 chunk가 더 생성되어있다.
create 를 통해 정보를 만들고 나면
chunk의 bk 영역에 stderr+138의 주솟 값이 적힌다 이유가 뭘까..?
#3. 삽질
#4. Exploit Code
'CTF Review' 카테고리의 다른 글
[ stack ] SFctf2020 LuckyLand (0) | 2020.07.26 |
---|---|
[ stack ] Rooters CTF 2019 Secure ROP (0) | 2019.11.27 |
[ stack ] Rooters CTF 2019 baby_pwn (0) | 2019.11.13 |
[ heap ] Backdoorctf 2019 babytcache (0) | 2019.11.06 |
[ stack ] BSidesSF 2019 CTF slowfire 미완성 (0) | 2019.11.04 |