본문 바로가기

포너블/lob

lob 8번

8번입니다. 먼저 코드를 확인해보겠습니다.

이번 코드에 추가된 것은 일단 인자의 갯수가 2개 이하여야 하며, argv[1]에서 공격을 할 수 없게 바뀌었습니다. 그렇기 때문에 저희는 argv[0]에 shell코드를 넣고 ret 값을 argv[0]중 하나로 옮겨 줄 것입니다. 

argv[0]에 shell코드를 넣어 공격을 할려면 우리가 평소에 사용했던 페이로드를 심볼링 링크 이름으로 사용하여 troll파일에 연결해 주면 됩니다.

윗줄 처럼 걸어주시면 됩니다. 단, 파일 이름엔 '/'기호를 사용할 수 없으므로 '/'을 나타나는 \x2f가 들어가 shell코드를 사용하면 오류가 발생합니다. 그렇기 때문에 \x2f가 없는 shell코드를 사용해주어야 합니다. 그리고 아래의 심볼릭 링크는 gdb에서 주소를 확이하기 위해 페이로드와 같은 길이의 이름으로 심볼릭 링크를 걸어주었습니다.

먼저 메모리를 쌓이는 순서를 볼때 argv[0]의 위치를 보기 이해서는 esp가 아닌 ebp부터 보는게 빠른데 그 이유는 스택에서 메모리 할당 영역이 argv[0]부분이 ebp보다 더 높은 주소에 할당되기 때문에 esp보다는 ebp부분부터 보는것이 더 효율적입니다. 위의 사진을 보면 2f를 찾을 수 있는데, 2f가 아스키 코드로  '/'이기 때문에 이 부분부터 argv[0]인 것이라고 생각했습니다. 그래서 이 주소를 기준으로 공격했습니다.

하지만 오류가 떴습니다. 그래서 ebp부터 주소를 다른 방식으로 확인해보았습니다.  ebp 부터 다시 차근히 주소를 자세히 알아보았습니다.

먼저 4크기만큼 주소를 확인해본 결과 중간에 0이 있는 것을 보고 0xbffffa14부분이 argv자체를 가리키는 2중포인터 임을 확인했습니다. 그 이유는 0xbfffa14부분으로 가서 4개를 확인해 보면, 0xbffffb11, 0xbffffbb2 이렇게 뜨는데 사진은 없지만 각각 들어가보면, 첫 번째 주소는 argv[0]의 내용을 확인 할 수 있었고, 두 번째 주소는 argv[1]의 내용을 확인할 수 있었습니다. 그렇기 때문에 첫 번째 주소로 들어간 후 파일이름에 깔아놓은 놉의 주소를 확인했습니다. 그리고 그 주소로 공격했으나 segmentation fault가 떠서 실패했습니다.

그래서 아래와 같이 주소를 다시 확인 해보았습니다.

위의 사진처럼 다시 놉이 깔려 있는 부분까지 확인 했고, 그 밑부분은 예상한대로 argv[1]의 내용이 저장되어 있는 것을 확인할 수 있었습니다. 그래서 gdb내용을 토대로 놉 부분으로 ret부분을 조정해주었습니다. 하지만 제대로 공격이 되지 않았고, 복사 파일이기 때문에 주소의 오차가 있을 수 있다고 생각하여 gdb 부분보다 조금 낮은 주소의 값을 주었더니 정상적으로 관리자 권한을 얻을 수 있었습니다.

그 결과 비밀번호 aspirin을 획득하였습니다.

'포너블 > lob' 카테고리의 다른 글

lob 10번  (0) 2020.01.11
lob 9번  (0) 2020.01.08
lob 7번  (0) 2020.01.05
lob 6번  (0) 2020.01.05
lob 5번  (0) 2020.01.05