6

대체 어떤식으로 풀어야 되는거죠?

제가 느끼기로는 name에 명령어를 넣고
command의 인덱스를 이용해서
name에 접근하는 방식으로 풀어야겠다고 생각했는데
제가 제대로 생각한게 맞나요?
이걸로 몇시간동안 해봤는데
name이 정확히 command[0]에서 얼마나 떨어져 있는건지 모르겠습니다.
혼자 test.c 같은거 만들어서 전역변수로 name[16] command[10]선언하고
그거 주소 포인터로 출력해보고
command[0]주소도 출력해 보고
name - command[0] 해서 대충 2099144, 2199160정도 나오길래
command[0] + 2000160 이런식으로 때려맞춰서 포인터연산으로 출력해 볼땐 문자열이 잘 나오는데
command[(2099160/4)] 이런식으로 하니까 또 안나오고 그러더라구요(command[1]이 command[0]과 4차이 나서)
이게 가장 쉬운건데 (전 문제는 그냥 넷캣 주소 치면 풀 수 있던 문제)
여기서도 쩔쩔 매면 어떡하죠?.. 일단 그래도 이문제는 풀어야 직성이 풀릴 것같습니다.
힌트라도 받고 싶어서 인터넷 뒤져봤는데 비슷한 글을 못찾겠고
참조로는 도저히 모르겠고
풀이라도 봐야되나 했는데 풀이는 못 보길래
갈피라도 잡게 해달라고 글 남깁니다 ㅠㅠ
제가 생각하는 방향이 맞는지
그리고 맞다면 위치를 어떻게 찾아야 하는지 알려주세요 ㅠㅠ

답변 1개
7

gdb 디버거를 통해 전역변수 name과 command가 각각 0x0804a060, 0x0804a0ac에 저장되어 있는걸 알 수 있어요.
그래서 command[19]가 name인걸 알수 있죠. system() 은 const char * 인수가 필요하니 name의 첫 4 바이트는 name[4]의 주소로 하고 나머지 name 배열에 "cat flag"를 저장하면 플래그값 출력 가능해지는 거 같아요.

근데 저도 못 푼게 메모리 주소를 name에 입력하려면 파이썬 커맨드를 piping 해야 하는데 (커맨드의 아웃풋을 다음 커맨드의 인풋으로 사용, 요런식으로 --> python -c “print(’\xb0\xa0\x04\x08’ + ‘cat flag’)” | nc host1.dreamhack.games [portnum]) 여기서 \x04는 EOT (End of Transmission) 문자라서 이후에 오는 입력값들을 무시해버림. (참고로 호스트 서버가 little endian이라서 메모리 주소 좌우변환 된거임) 여기서는 아무나 바통터치좀. 질문있으면 친구신청.