2011-12-07 31 views
57

tôi thường chạy chương trình của tôi với:gdb - gỡ rối với đầu vào đường ống (không tranh cãi)

perl -e 'print "A"x200' | ./vuln_prog 

Các stdin được tiêu thụ bởi một hàm gets() trong C++.

Nếu đây chỉ là một cuộc tranh luận lệnh, tôi có thể mở gdb bằng cách thực hiện:

gdb ./vuln_prog 
run $(perl -e 'print "A"x200') 

Tuy nhiên, kịch bản của tôi không phải là một đối số lệnh, mà đúng hơn là đầu vào (? STDIN). Làm thế nào tôi sẽ gỡ lỗi này trong gdb? Tôi đã thử một loạt các tùy chọn, nhưng không có gì có vẻ thực sự hiệu quả.

Tôi thường chỉ chạy gdb trong tiến trình và khi nó nhắc người dùng nhập, hãy nhập nó vào, tuy nhiên tôi không muốn nhập "A". Tôi muốn nhập tất cả các ký tự từ \ x00- \ xff, mà tôi không thể gõ.

+0

Tại sao bạn sử dụng 'get'? Tôi có nghĩa là đôi khi nó chấp nhận được (như nếu bạn chỉ viết một chương trình nhanh để kiểm tra một cái gì đó, hoặc nếu chương trình sẽ chỉ được chạy với đầu vào đáng tin cậy) nhưng tôi tò mò. – flarn2006

+0

Đó không phải mã của tôi. Đó là một thử thách kỹ thuật đảo ngược thú vị, nơi mã được cung cấp. – mandreko

+0

Oh okay. Có phải 'được' cố tình sử dụng * bởi vì * nó dễ bị tổn thương, giống như một phần của giải pháp khả thi cho thử thách? – flarn2006

Trả lời

77
gdb ./vuln_prog 
run < filename_with_input 
+0

Cảm ơn bạn rất nhiều. Tôi đã cố gắng để chạy các đầu vào trực tiếp, nơi tôi nên có suy nghĩ để chỉ cần in mã perl vào một tập tin, và đầu vào nó. Điều đó làm việc tuyệt vời. – mandreko

+1

Có tương đương 'lldb' không? –

+1

@ThomasAhle Đối với lldb tương đương http://stackoverflow.com/questions/29861242/cannot-get-mac-os-x-lldb-process-to-read-the-stdin – jernkuan

Các vấn đề liên quan