ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [시스템 해킹] pwnable.kr 5번(passcode) 와~~
    카테고리 없음 2020. 2. 12. 22:56

    >


    안녕하세요 코드 사기꾼이다오항시은 pwanble.kr의 5번 문제를 풀겠습니다.


    >


    문제를 클릭해보니 로그인 시스템을 만들었다고 적혀있네요. 컴퍼 하나 에러는 발생하지 않았지만 warning은 과인이었습니다.(여후: gcc에서는 warning을 무시할 수 있습니다...) 각설하여 문제로 연결해 보겠습니다.


    문재에 접속하여 passcode.c라는 시작을 연 결과입니다. 첫 00바이트만의 주소 공간에 이름을 입력 받아 passcode첫 passcode2가 각 338첫 50첫 337첫 337과 함께라면 flag를 나타내는 글이네요.그런데 이상하게도 login 함수에서 scanf를 사용할 때, 주소 값이 아니라 주소 값이 가리키는 변수 값을 준 것을 확인할 수 있습니다. passcode의 변수는 초기화 되어있지 않은데. 왜 warning이 나왔는지 알 것 같아요.자 그럼 소스도 다 봤으니까 디스어셈블링 해볼게요


    welcome 프로시저의 디스어셈블링 결과이다.  welcom+48을 보면 scanf가 실행되는 것을 볼 수 슴니다. scanf는 함수 실행 전에 변수의 주소 값 및 포맷 스트링을 인제이션으로 받습니다.지금 쥬소가프에 들어간 부분(lea)가 ebp-0x70만 없어서 name배열은 아마 ebp-0x70에서 ebp-0x70+0x64(10진 수백)까지 정의되고 있는 것이다. 자기 후에는 특별한 것이 없기 때문에 login 프로시저의 디스어셈블링 결과를 보도록 하겠습니다.


    login+24를 보면에 벚꽃이 특정 값을 edx에 이양하는 모습을 볼 수 있으나 이는 scanf앞에 인자에 스아프, 서해(서해) 나쁘지 않아서 왔기 때문에 passcode하나로 유추할 수 있다, 같은 비법으로 passcode2번 유추할 수 있습니다. 유추된 passcode하나그와 passcode2의 주소 값은 이렇습니다.passcode하나:ebp-0x하나 0, passcode2:ebp-0xc에서도 정 이야기 이상한 것이 확신하게 우리는 welcome프로시저에서 name의 할당 구역이 ebp-0x70~ebp-0xc인 것을 확인하였습니다. 유추된 passcode하나의 주소 값을 보면 name의 마지막 4바이트의 구간임을 알 수 있는데, 이것은 passcode한 초기화되지 않았기 때문에 생기는 문제점 이프니다니다. 이로써 name배열을 입력할 때 passcode의 1개의 값을 모두 들을 수 있죠. 그런데 아무리 생각 봐도 passcode2에 값을 입력하는 법은 떠오르지 않네요.우리는 새로운 국면에 도달했습니다. 기존의 접근방식으로는 문제를 해결할 수 없다고 생각하고 다른 비법을 생각해 본 결과, 프로그램의 동작순서를 변경하여 굳이 passcode를 검증하는 if문을 거치지 않고 시스템 함수에 접속하는 비법이 있다고 생각합니다.기본적인 것부터 생각해 봅시다. 우리가 컴퍼 하나를 실행하고 오브젝트 파 하나를 실행할 수 있게 하려면 프로시저의 실행 코드를 찾아서 오브젝트 파 하나와 연결을 시켜야 합니다. 이러한 프로시저가 한컴퍼리가 되어 모여있는 곳을 공유 라이브러리라고 합니다.이처럼 원하는 오브젝트의 1개를 연결하는 작업을 Linking라고 합니다만, 이 Linking방식에는 2종류가 있습니다. Dynamic과 Static 방식입니다. Static 방식은 파하나가 발발할 때 라이브러리 인기를 포함한 실행파 하나를 만드는 것입니다.


    >


    반면 Dynamic 방식은 공유 라이브러리를 하과인의 메모리 공간에 적재하여 여러 실행 파일로 공유하여 사용하도록 하는 방식이다.


    >


    Dynamic 방식으로 컴파일을 하게 되면 프로시저를 호출할 때 PLT와 GOT를 사용하게 됩니다. 그 이유는 메모리에 라이브러리를 적재시켜 사용하고 있기 때문에 프로시저의 호출 주소를 모르기 때문입니다.


    PLT(Procedure Linkage Table)란 외부 프로시저를 연결하는 테이블이다. PLT를 통해 다른 라이브러리에 있는 프로시저를 호출하여 사용할 수 있습니다.


    GOT(Global Offset Table)란 PLT가 참조하는 실제 프로시저의 주소가 들어 있는 테이블입니다. PLT와 GOT는 프로시저가 차소리 호출 여부에 따라 루틴을 달리합니다.만약에 프로시저를 차소리 호출할 경우에는 프로시저의 PLT에서 GOT로 넘어가는데 GOT가 프로시저의 주소를 모르는 상태이기 때문에 dl_runtime_resolve라는 함수를 사용하여 필요한 프로시저의 주소를 알고 이를 GOT에 써서 호출합니다.


    >


    그러나 2번째의 동작에서는 GOT가 이미 프로시저의 주소를 알고 있는 상태이어서 당장 GOT를 참조 칠로프로시ー쟈을 부르 숨깁니다.


    >


    설명하고 이에키이 계속되었지만 다시 본론으로 돌아가서 우리는 passcode1변수에 특정 절차 GOT주소를 적어 해당 프로시저로 이동하는 GOT overwrite라는 방법을 이용하고 사건을 해결할 것이다.


    name함수를 받을 때 passcode1의 값을 정할 수 있기 때문에 우리는 scanf다소리의 코드인 fflush함수의 주소를 passcode1에 넣기로 passcode2에는 system함수의 즉석의 전 단계 인스트럭션을 넣어 문재를 풀어 보겠습니다. 그러기 위해서는, 최초로 fflush가 GOT를 알 필요가 있다.


    >


    fflush의 GOT값은 0x804a004입니다. 그럼 passcode2에 들일 가치가 어떻게 구할 수 있을까요?


    >


    간단합니다. 디스어셈블링된 코드를 보고 시스템 직전의 인스트럭션 주소를 확인하시면 됩니다.0x080485e3네요 그러나 passcode2는 파.세인트 d(하나 0진수)형식으로 값을 받기 때문에 우리도 가격을 하나 0진수로 변환된 하나 345하나 4개 47을 넣어 줘야 한다.자, 완성된 페이로드는, 이 후와 같겠죠. name의 마지막 4바이트는 passcode한 값이어서 name에 불필요한 가격 96바이트를 넣고 마지막으로 fflush의 GOT을 넣습니다. 그 때문에 passcode2값 입력을 위해서 하나 345하나 4개 47를 넣어 줄것입니다.payload:'a'*96+"\x04\xa0\x04\08"+"하나 345하나 4개 47"


    >



    댓글

Designed by Tistory.