how to find ROP gadget

가장 최적의 방법으로 ROP를 찾는 방법이 뭘까 많이 고심한 끝에 나의 입장에서 최적의 방식을 선정하였다.

일단 기본적인 방식은 크게 3가지이다.

  1. objdump 후 grep으로 찾기
  2. pwntools 코드 상에서 rop.find_gadjet 으로 찾기
  3. 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'