how to find ROP gadget
가장 최적의 방법으로 ROP를 찾는 방법이 뭘까 많이 고심한 끝에 나의 입장에서 최적의 방식을 선정하였다.
일단 기본적인 방식은 크게 3가지이다.
- objdump 후 grep으로 찾기
- pwntools 코드 상에서 rop.find_gadjet 으로 찾기
- ROPgadget 명령어로 찾기
일단 1번은 비효율적이라 제외하고 2,3번이 메인인데
2번을 쓰면서 느낌점은 너무 불편하다는 것을 느꼈다. ROP가젯이 많을 때도 별로 이고 중간에 다른 명령어가 들어갈때면 더 찾기 불편하다
따라서 3번이 선정되었다.
C
(pwnenv) root@f0964274fcc4:/home/basic_rop_x64# ROPgadget --binary basic_rop_x64 | grep 'pop rdi'
0x0000000000400883 : pop rdi ; ret사용 방식은 다음과 같다. ROPgadget은 당연히 ret이 포함되어 있으니 grep에서 안넣어도 된다.
따라서
C
(pwnenv) root@f0964274fcc4:/home/basic_rop_x64# ROPgadget --binary basic_rop_x64 | grep 'pop rsi'
0x0000000000400881 : pop rsi ; pop r15 ; ret다음과 같이 pop r15 중간에 뭐가 있어도 상관 없을때 찾기 좋고 그냥 최적화 되어있는 것 같다.
C
ROPgadget --binary basic_rop_x64 | grep 'pop rsi'