2017-10-31 36 views
0

나는 원격으로 (학업 목적으로) 악용해야하는 32 비트 elf 프로그램을 가지고있다. 최종 목표는 셸을 생성하는 것입니다. 원하는 데이터로 채울 수있는 스택이 있으며 printf 형식 문자열 중 하나를 남용 할 수 있습니다. 유일한 문제는 system/execv/execvp를 가져 오지 않는다는 것입니다. .got.plt 세그먼트는별로 ​​유용하지 않은 함수로 가득 차서 atoisystem으로 바꾸고 싶습니다. 그 이유는 서명이 매우 유사하고 코드 흐름이 올바른 함수임을 나타 내기 때문입니다. 다음 시도를 위해 IDA 원격 디버그를 사용 했으므로 잘못된 스택 정렬과 올바른 형식 문자열이 문제가되지 않습니다. 나는 그것이 가능하다는 것을 확실히하고 싶었고 분명히 아직 나에게는 그렇지 않다.ASLR이 켜져있을 때 가져 오기되지 않은 libc 기능의 주소를 찾는 방법은 무엇입니까?

처음에는 [email protected]을 시스템의 무작위 주소로 바꾸려고했습니다. SIGSEGV가 있습니다.

좋아요, 아마도 ASLR 때문일 수 있으므로 다른 것을 시도해보십시오. gdb를로드하고 [email protected][email protected]을 조회했습니다. 그런 다음 diff (0xDB50)를 계산했습니다. 그래서 다음 번에 atoi의 주소를 .got.plt 세그먼트의 시스템으로 변경했을 때, 실제로는 그 값에 diff를 추가하여 시스템 주소를 얻었습니다. SIGSEGV를 다시 받으십시오.

내 논리 :

0xb7deeda0 <__libc_system> 
0xb7de1250 <atoi> 
diff = 0xb7deeda0 - 0xb7de1250 
[email protected] = [email protected] + diff 
example: 0x08048726 + DB50 = 0x08056276 

사람이 내가 잘못했다 내가 .got.plt에서 함수 주소를 누출의 도움으로 "() 유효한 시스템"을 어떻게 이동할 수 있는지 말해 줄래?

+0

일반적으로하는 일은 효과가 있습니다. 그것이 아니기 때문에, 당신은 틀린 일을해야만합니다. 하지만 당신이 질문을 무의미한 말로 표현했기 때문에 그게 무엇인지를 말하는 것은 불가능합니다 : "시스템의 정적 주소"란 무엇입니까? .plt 세그먼트에서 시스템으로 atoi를 변경한다는 것은 무엇을 의미합니까? –

+0

문제는 지연 바인딩과 관련이 있다고 제안합니까, 그렇지 않습니까? 그래서'export LD_BIND_NOW = 1'과 함께 작동해야합니까? – Jezz

답변

0

내 질문에 답하십시오. 로컬 libc의 함수 사이의 거리를 측정한다고해서 원격 libc가 동일한 정렬을 가질 것이라는 보장은 없습니다.

  • Libc binary collection
  • : 두 개의 주소를 알고있는 경우 libc의 버전을 찾을 수

    readelf -s /lib32/libc-2.19.so | grep printf 
    

    가능한 방법 : 당신은 다음과 같이 주소의 차이를 얻을 수 있습니다, 어떻게 든 libc의 버전을 찾을 수있다 libcdb.com

  • pwnlib
  • ... 또는 원격 시스템의 셸에 대한 액세스 권한이 있습니다. 도서관 독자가 직접 들여다 볼 수 있습니다.