BountyCon 2020 - Anti What

Image 1

안 열림

Image 2

기드라 굿

int main(undefined8 param_1,undefined8 *param_2)
{
  int iVar1;
  long lVar2;
  long in_FS_OFFSET;
  int local_15c;
  termios local_158;
  long local_10;

  local_10 = *(long *)(in_FS_OFFSET + 0x28);
  local_15c = 0;
  lVar2 = ptrace(PTRACE_TRACEME,0,1,0);
  if (lVar2 == 0) {
    local_15c = 2;
  }
  lVar2 = ptrace(PTRACE_TRACEME,0,1,0);
  if (lVar2 == -1) {
    local_15c = local_15c * 3;
  }
  if (local_15c == 6) {
    RC4_set_key((RC4_KEY *)&stack0xfffffffffffffee8,0x32,key);
    RC4((RC4_KEY *)&stack0xfffffffffffffee8,0x4e,(uchar *)&ptext,(uchar *)&ptext);
    runPayload();
    puts("Press any key to quit...");
    tcgetattr(0,&local_158);
    local_158.c_lflag = local_158.c_lflag & 0xfffffffd;
    local_158.c_cc[6] = '\x01';
    local_158.c_cc[5] = '\0';
    tcsetattr(0,0,&local_158);
    getchar();
    iVar1 = 0;
  }
  else {
    iVar1 = unlink((char *)*param_2);
  }
  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return iVar1;
}

main을 보면 위와 같다.

local_15c를 6으로 만들면 뭔가 개많이 실행이 됨

근데 local_15c는 ptrace의 반환값인 lVar2 값에 의해 조정 가능

—–> ptrace 우회가 필요!!!

  1. ==을 !=으로 바꾸기

Image 3

if를 누르면 그에 해당하는 어셈블리 코드가 좌측에 나옴

Image 4

74를 75로 바꿔주면 JZ가 JNZ로 바뀜

  1. if부분을 통으로 0x90(NOP)으로 채우기

Image 5

  1. 기드라 저장이 힘들어서 아이다로 어셈블함

Image 6

저장하고 ubuntu에서 실행

일단 뭔가 runPayload까지 실행해보고 싶어서

Image 7

해봤는데 바로 플래그가 나옴

…그치만 일단 설명을 해야하니까

Image 8

runPayload() 함수를 보자 v1에 malloc으로 메모리를 할당하고 unpackPayload를 함

할당된 곳에 배열과 ptext값을 넣고 있음 + runPayload 하기 전 ptext는 RC4구문을 거침

  1. 어셈블로 ptrace bypass하기
  2. RC4로 돌린 ptext 구하고 저장된 배열 조립해서 result 구하기