fedora 원정대 core 3 hell_fire -> evil_wizard

fedora 원정대 core 3 hell_fire -> evil_wizard

evil_wizard.c


hint 를 보면 GOT overwritting이 써있다. GOT overwritting 공격을 시도하여 쉘을 얻을 수 있다.

strcpy함수에서 overflow가 발생하여 eip를 원하는 곳으로 이동 시킬수 있게된다.
eip를 strcpy의 plt(고정주소)로 이동시켜 strcpy함수를 호출할 수 있고 ret에 poppopret가젯의 주소를 넣어 rop공격코드를 작성 할 수 있다.

strcpy를 이용하여 memset의 got에 system함수의 주소를 1바이트씩 복사 할 것이다. 그러면 memset을 호출하게되면 결국 memset의 got에 덮어씌여진 system함수를 호출 하게된다.

system함수에 인자로 들어갈 '/bin/sh'문자열도 위와 같은 rop 방식으로 strcpy함수를 호출하여 memcpy의 got에 복사하여 system함수의 인자로 넘겨 줄 것이다.

이제 필요한 주소들을 찾고 코드를 작성하면 된다.

먼저 poppopret가젯의 주소는


poppopret의 주소는 0x0804854f이다.

execve로 덮힘을 당할 memset@plt와 memset got를 찾는다.


memset@plt의 주소는 0x08048474이다.



got의 memset주소는 0x08049898이다.
got의 memcpy주소는 0x080498c0이다.


system의 주소는 0x007507c0이다.


strcpy@plt의 주소는 0x08048494이다.

필요한 got, plt주소는 구했으니

system의 주소, /, b, i, n, /, s, h가 있는 주소를 다 구하고 strcpy를 이용해서 1바이트씩 덮어 써야한다.


이렇게 전부다 뒤져서 익스플로잇 코드를 작성한다.


ret부분에 strcpy가 덮이고 인자로 덮힘당할 memsetgot의 주소와 덮을 문자의 주소가 들어간다. strcpy함수가 끝나면 poppopret 이 수행되어 인자 두개를 제끼고 다시 strcpy함수로 들어가는 rop이다.

공격을 하면


쉘을 얻을수 있다.

쉘코드:

댓글 4개:

  1. 지금 한 공격이 rop인가요?
    rop체인 구성이랑 비슷한거 같은데 다른가요?

    답글삭제
  2. 네 ROP이용하는 공격 맞습니다.
    strcpy함수를 이용해서 system함수에 들어갈 인자('/bin/sh')를 구성해주고
    memset의 Got를 system함수의 주소로 덮어서 memset함수가 호출될 때 system함수가 호출되는 방식입니다.

    답글삭제
  3. 혹시 네이트온이나 카카오톡 하시면 연락처좀 알려주실수있나요??
    궁굼한게 많아서..부탁드립니다.

    답글삭제
  4. 위에 about 탭가시면 연락처 있어요

    답글삭제