ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [시스템 해킹] pwnable 확인해볼까요
    카테고리 없음 2020. 1. 18. 00:52

    >


    안녕하세요 코드 사기꾼입니다오거의 매일은 pwanble.kr의 5번 문재를 풀겠습니다.


    >


    사고를 클릭해보니 로그인 시스템을 만들었다고 나와있네요. 코무 파 1에러가 발생하지는 않았지만, warning은 자신 왔습니다.후 : gcc에서는 warning을 무시할 수 있습니다.각 설과 사상으로 접속해 보도록 하겠습니다.


    사건에 접속하고 passcode.c라는 파 1을 열어 본 결과다. 100바이트만의 주소 공간에 이름을 입력 받아 passcode1과 passcode2가 각 338150,13371337과 함께라면 flag을 나타내사곤네입니다.그런데 이상하게도 login함수로 scanf를 사용할 때 주소값이 아닌 주소값이 알려주는 변수의 값을 전달했음을 확인할 수 있습니다. passcode 변수는 초기화도 안됐는데 예기입니다. 왜 warning 이 자신 왔는지 알겠어요 그럼 소스도 다 봤으니 디스어셈블링 해봅시다


    welcome 프로시저의 디스어셈블링 결과입니다.  welcom+48을 보면 scanf가 실행되는 것을 볼 수 슴니다. scanf는 함수 실행 전에 변수의 주소값 및 포맷 스트링을 인제로 받습니다.지금 쥬소가프에 들어간 부분(lea)가 ebp-0x70만 없어서 name배열은 아마 ebp-0x70에서 ebp-0x70+0x64(하나 0진수 하나 00)까지 정의되고 있는 것 이프니다니다. 본인은 특별한 것이 없기 때문에 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 일값을 함께 넣을 수 있을 것입니다. 그러나 아무리 소견을 해도 passcode2에 값을 입력하는 법은 떠오르지 않네요.우리는 새로운 국면에 도달했다 기존의 어프로치로는 문재를 해결할 수 없다는 소견이 있고, 다른 비결을 소견한 결과, 프로그램의 동작 순서를 변경하여 굳이 passcode를 검증하는 if문을 거치지 않고 system 함수에 접근하는 비결이 있을 것 같습니다.기본적인 것부터 소견해 보도록 합시다. 우리가 컴파일을 진행하고 오브젝트 파일을 실행 가능하게 하려면 프로시저의 실행 코드를 찾아 오브젝트 파일과 연결해야 한다. 이런 프로시저들이 컴파일되어 모여있는 곳을 우리는 공유 라이브러리라고 한다.이처럼 필요한 오브젝트 파일을 접속시키는 작업을 Linking라고 합니다만, 이 Linking방식에는 2개 있습니다. Dynamic과 Static 방식입니다. Static 방식은 파일을 발생할 때 라이브러리의 이 이야기를 포함한 실행 파일을 만드는 것입니다.


    >


    한편 Dynamic방식은 공유 라이브러리를 하 쟈싱의 메모리 공간에 적재하고 다양한 실헹파 1로 공유하고 사용하도록 하는 방식이다.


    >


    Dynamic방식으로 컴(1을 진행하면 프로시저를 호출 PLT와 GOT라는 것을 사용하게 됩니다. 그 이유는 메모리에 라이브러리를 적재시켜 사용하기 때문에 프로시저의 호출 주소를 알 수 없기 때문이다.


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


    GOT(Global Offset Table)란 PLT가 참조하는 실제 프로시저 주소가 들어있는 테이블인 것.PLT와 GOT는 프로시저가 아내 sound 호출밖에 안하느냐에 따라 루틴을 달리합니다.만약 프로시저를 아내 sound 호출할 경우에는 프로시저의 PLT에서 GOT로 점프하는데, GOT가 프로시저의 주소를 알 수 없는 상태이기 때문에 dl_runtime_resolve라는 함수를 사용하여 필요한 프로시저의 주소를 알 수 있어서 이를 GOT에 써서 불러냅니다.


    >


    그러나 2번째의 동작에서는 GOT가 이미 프로시저의 주소를 알고 있는 상태여서 곧 GOT를 참조 칠로프로시ー쟈을 부르히스.


    >


    설명하고 있기 때문에 내용이 길어졌지만 다시 본론으로 돌아가서 우리는 passcode1변수에 특정 절차 GOT주소를 적어 해당 프로시저로 이동하는 GOT overwrite이라는 비결을 이용하고 위 문 루루 해결하는 것입니다.


    name함수를 받을 때 passcode한 값을 정할 수 있기 때문에 우리는 scanf, 앞으로 코드인 fflush함수의 주소를 passcode하나에 넣어 passcode2에는 system함수의 즉석의 전 단계 인스트럭션을 넣어 문제를 풀어 보겠습니다. 그러기 위해서는 제일 이제 flush가 GOT를 알아야 합니다.


    >


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


    >


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


    >



    댓글

Designed by Tistory.